我正在动态分配内存以维护项目列表,但是在尝试使用 删除项目时free()
,出现内存堆损坏错误。而且我知道这在 C++(或 java,或任何其他面向对象的语言)中会容易得多,但我必须在 C 中执行此操作(注意:C 代码,但在 Microsoft Visual Studio 2010 中编译,并且因此是 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
在删除项目之前,所以它已经从列表中断开,如果这很重要的话。