【问题标题】:Freeing structs correctly正确释放结构
【发布时间】: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。当然,您可以简单地避免使用mallocfree

标签: c pointers malloc free


【解决方案1】:

改变

FolderInfo Folders[MAX_FOLDERS] 

 FolderInfo* Folders[MAX_FOLDERS] 

Folders[ID] = *this 

 Folders[ID] = this. 

当然,您可以简单地避免使用 malloc 和 free 开始。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 2021-08-02
    相关资源
    最近更新 更多