アイテムのリストを維持するためにメモリを動的に割り当てていますが、を使用してアイテムを削除しようとするとfree()
、メモリヒープの破損エラーが発生します。そして、これはC ++(またはJava、または実際には他のオブジェクト指向言語)で行う方がはるかに簡単であることを私は知っていますが、これはCで行う必要があります(注:Cコードですが、Microsoft VisualStudio2010でコンパイルされています。したがって、C ++コンパイラ)。
アイテムの「外観」は次のとおりです。
//item.h
typedef struct
{
char* titel;
char* auteur;
int jaar;
} Boek;
typedef struct
{
enum {BOEK, TIJDSCHRIFT} itemType;
union {
Boek* boek;
Tijdschrift* tijdschrift;
} itemData;
struct Item* next;
} Item;
作成/割り当て方法は次のとおりです。strdup
また、文字列の割り当てに使用とmalloc
/を切り替えましstrcpy
たが、効果がないようです。また、私が削除しようとしているアイテムはBOEK
タイプですが、TIJDSCHRIFT
アロケータ/デアロケータは同じように機能します。
//item.c
Item* nieuwBoek(char* _titel, char* _auteur, int _jaar)
{
Item* item = (Item*) malloc(sizeof(Item*));
item->itemType=BOEK;
item->itemData.boek=(Boek*) malloc(sizeof(Boek*));
item->itemData.boek->titel=strdup(_titel);
item->itemData.boek->auteur=strdup(_auteur);
item->itemData.boek->jaar=_jaar;
item->next=NULL;
return item;
}
item->next
返されたポインタは、リスト内の前の項目のに渡す別の関数によって使用されます。
これが私がそれを解放しようとしている方法です。構造体自体を解放する前に、割り当てられた文字列を解放する必要があることは理解していますが、free(item)を呼び出すだけでも(他のコードをコメントアウトするかdeleteItem
、メインコードで呼び出すことによってfree(nieuwBoek(...)
:ヒープ破損エラー。
void deleteItem(Item* item)
{
if (item->itemType==BOEK)
{
free(item->itemData.boek->titel); // When not running in debug-mode it crashes here.
free(item->itemData.boek->auteur);
free(item->itemData.boek); // When running in debug mode it crashes here.
}
/*else if... TIJDSCHRIFT deallocator here*/
free(item);
}
また、渡されるポインターdeleteItem()
は、アイテムを指す有効なポインターです。それはおそらく私が間違っている/行方不明にしている信じられないほど愚かなことですが、私は今日この問題に困惑しているので、皆さんに助けを求めています。ああ、アイテムを削除する前ににnext->pointer
設定されNULL
ているので、それが重要な場合は、リストからすでに切断されています。