Guten Tag zusammen,
ich hab ein Problem bei meinem C Programm. Habe eine ArrayList programmiert, die dynamisch Speicher anfordert und freigibt und beliebige Elemente aufnimmt. Alle Funktionen funktionieren auch soweit wie gewollt. Nur beim Freigeben der gesamten Liste hapert es irgendwie.
Hier erstmal meine ArrayList Definition:
Soll also eine beliebige Anzahl von void Pointern aufnehmen.
Den Funktionszeiger für Freigeben-Funktion habe ich wie folgt definiert:
Hier die Destroy Funtkion bei der es knallt, jedoch auch nur wenn destroy_data = TRUE ist. Also scheint ja irgendwas mit dem Funktionszeiger destroy_func nicht richtig zu funktionieren.
Beim Entfernen von Elementen nutze ich den Funktionszeiger jedoch auch und da scheint es keine Probleme zu geben.
Zum Testen habe ich mir dann schnell ein Modul Point geschrieben, welches wie folgt aussieht:
Und mein C Simple Test sieht folgendermaßen aus:
Wenn ich den Test ausführe, kommt folgender Fehler:
Außerdem springt mein Spybot S&D an, wenn ich den Test debuggen will:
Mache ich irgendwo etwas falsch? Bin auf dem Gebiet Funktionszeiger noch ganz neu und dynamische Speicherverwaltung auch nocht nicht sonderlich erfahren.
Den kompletten Sourcecode gibt es als Anhang.
Bin für jegliche Hilfe dankbar.
Greez boFFeL
EDIT: Ich hab grade bemerkt, dass ich meinem Test natürlich versehentlich Point1 2 mal hinzufüge und dann versucht wird ein free auf einem Pointer mit dem Wert NULL durchzuführen (Insofern es funktioniert, wie es soll).
Entfernen dieser Codezeile führt zu keinem Fehler mehr in Netbeans. Bestanden wird der Testfall jedoch nicht und die Spybot Meldung kommt weiterhin.
ich hab ein Problem bei meinem C Programm. Habe eine ArrayList programmiert, die dynamisch Speicher anfordert und freigibt und beliebige Elemente aufnimmt. Alle Funktionen funktionieren auch soweit wie gewollt. Nur beim Freigeben der gesamten Liste hapert es irgendwie.
Hier erstmal meine ArrayList Definition:
Code:
typedef struct
{
void **elements;
int element_count;
int size;
EQUALS equal_func;
DESTROY destroy_func;
} ARRAY_LIST;
Den Funktionszeiger für Freigeben-Funktion habe ich wie folgt definiert:
Code:
typedef void (*DESTROY) (void **);
Code:
extern void array_list_destroy(BOOL destroy_data, ARRAY_LIST **list)
{
int current_index;
if (list == NULL || *list == NULL)
{
return;
}
current_index = 0;
if ((*list)->destroy_func != NULL && destroy_data)
{
while (current_index < (*list)->size)
{
(*list)->destroy_func(&((*list)->elements[current_index]));
current_index++;
}
}
free(*list);
*list = NULL;
}
Beim Entfernen von Elementen nutze ich den Funktionszeiger jedoch auch und da scheint es keine Probleme zu geben.
Code:
extern BOOL array_list_remove_index(int index, ARRAY_LIST *list)
{
array_list_not_null(list);
if (index < 0 || index > list->element_count - 1)
{
return FALSE;
}
if (index < list->element_count - 1)
{
/* Zu entfernendes Element liegt nicht am Ende, also müssen alle Folge-
* elemente um eine Position vorgerückt werden. */
int current_index = index;
while (current_index < list->element_count - 1)
{
list->elements[current_index] = list->elements[current_index + 1];
current_index++;
}
}
list->element_count--;
/* Speicherplatz des entfernten Elements freigeben. */
if (list->destroy_func != NULL)
{
list->destroy_func(&(list->elements[list->element_count]));
}
else
{
list->elements[list->element_count] = NULL;
}
/* Prüfen ob Speicherplatz freigegeben werden kann. */
if (list->size - list->element_count > ALLOC_ELEMENTS)
{
array_list_realloc(list->size - ALLOC_ELEMENTS,
"array_list_remove_index", &list);
}
return TRUE;
}
Zum Testen habe ich mir dann schnell ein Modul Point geschrieben, welches wie folgt aussieht:
Code:
extern POINT *new_point(int x, int y)
{
POINT *point = malloc(sizeof(POINT));
if (point != NULL)
{
point->x = x;
point->y = y;
}
return point;
}
extern void destroy_point(POINT **point)
{
free(*point);
*point = NULL;
}
extern BOOL point_equals(POINT *point1, POINT *point2)
{
return (point1->x == point2->x) && (point1->y == point2->y);
}
Und mein C Simple Test sieht folgendermaßen aus:
Code:
test_array_list_destroy()
{
printf("test_array_list_destroy\n");
ARRAY_LIST *list = new_array_list((EQUALS) point_equals,
(DESTROY) destroy_point);
POINT *point1 = new_point(1, 2);
POINT *point2 = new_point(3, 4);
array_list_add_append(point1, list);
array_list_add_append(point2, list);
array_list_add_append(point1, list);
array_list_destroy(TRUE, &list);
if (point1 != NULL || point2 != NULL)
{
printf("%%TEST_FAILED%% time=0 testname=test_array_list_destroy "
"(array_list_test) message=Speicher des Elements wurde nicht "
"korrekt freigegeben.\n");
}
}
Wenn ich den Test ausführe, kommt folgender Fehler:
/bin/sh: line 6: 4064 Aborted (core dumped) ./build/Debug/Cygwin_4.x-Windows/tests/TestFiles/f2
Außerdem springt mein Spybot S&D an, wenn ich den Test debuggen will:
Mache ich irgendwo etwas falsch? Bin auf dem Gebiet Funktionszeiger noch ganz neu und dynamische Speicherverwaltung auch nocht nicht sonderlich erfahren.
Den kompletten Sourcecode gibt es als Anhang.
Bin für jegliche Hilfe dankbar.
Greez boFFeL
EDIT: Ich hab grade bemerkt, dass ich meinem Test natürlich versehentlich Point1 2 mal hinzufüge und dann versucht wird ein free auf einem Pointer mit dem Wert NULL durchzuführen (Insofern es funktioniert, wie es soll).
Entfernen dieser Codezeile führt zu keinem Fehler mehr in Netbeans. Bestanden wird der Testfall jedoch nicht und die Spybot Meldung kommt weiterhin.
Anhänge
Zuletzt bearbeitet: