【发布时间】:2014-11-14 23:05:38
【问题描述】:
我正在尝试释放一个结构,但遇到了麻烦。我正在编程的是一种 n 叉树或虚拟文件系统。我有 2 个不同的结构(一个用于文件夹,一个用于文件)和一个用于存储每个元素的每个结构的数组。这些结构有一个成员 ID,我已经创建了一个文件/文件夹,因此我可以使用 Folders[ID] 获取一个文件/文件夹,这将返回具有该 ID 的结构。我遇到的问题是删除/释放它们。首先,如果是要删除的文件夹,它会递归检查子文件和文件夹,并首先删除它们。出于某种原因,无论我尝试什么,我都无法让 free() 工作。
我的文件夹结构:
typedef struct {
FolderID selfID;
FolderID parentID;
/* Other members are not important */
} FolderInfo;
我的数组:
FolderInfo Folders[MAX_FOLDERS];
如何将 FolderInfo 结构添加到数组中(在我的 new_folder 函数中):
/* ... */
FolderInfo *this = malloc(sizeof (FolderInfo));
/* ... */
ID++;
Folders[ID] = *this;
/* ... */
删除功能:
int32_t delete_folder(FolderID ID) {
if(FolderIsEmpty(ID) == 1) {
return -1; /* Error */
}
/* Check for children and delete them recursively */
/* ... */
free(Folders[ID]);
return 0;
}
每次我创建一个新文件/文件夹时,它都会添加到索引 ID 下的文件/文件夹数组中,因此 Folders[ID] 应该获取具有该 ID 的结构。我在这里错过了什么?
提前致谢
【问题讨论】:
-
你怎么知道
free不起作用? -
Folders[ID]不是指针。这是一个结构。您不能将其传递给free()。它是Folders的成员,因此当Folders被释放时(如果它是局部变量,则在其作用域的末尾,或者如果它是全局变量,则在程序退出时),它将被自动释放。据我所知,整个动态分配过程在您的代码中完全没用,因为您不依赖于动态分配的结构。但是,您正在泄漏内存,因为您丢失了指向malloc()ated(原始,临时)结构的指针。 -
如你所说,
Folders[]是一个已经分配了内存的结构数组。那么为什么还要动态分配更多呢? -
将
FolderInfo Folders[MAX_FOLDERS]更改为FolderInfo* Folders[MAX_FOLDERS]和Folders[ID] = *this更改为Folders[ID] = this。当然,您可以简单地避免使用malloc和free。