C 存储在数组中的自由结构

C 存储在数组中的自由结构,c,pointers,struct,free,C,Pointers,Struct,Free,我目前正在开发一个虚拟文件系统。没有实际的物理文件夹或文件,只是练习数据结构。要创建文件或文件夹,我有以下结构: struct FS_Object { int32_t id; struct FS_Object* parent; dataType dataType; FolderInfo folderInfo; FileInfo fileInfo; }; FolderInfo和FileInfo是包含ID、名称和一些其他属性的结构。 Im将每个创建的

我目前正在开发一个虚拟文件系统。没有实际的物理文件夹或文件,只是练习数据结构。要创建文件或文件夹,我有以下结构:

struct FS_Object {
    int32_t id;
    struct FS_Object* parent;
    dataType dataType;
    FolderInfo  folderInfo;
    FileInfo    fileInfo;
};
FolderInfo和FileInfo是包含ID、名称和一些其他属性的结构。
Im将每个创建的结构存储在全局数组中以访问属性:

FS_Object* dataList;
因此,如果我想释放先前创建的FS_对象(比如存储在dataList[1]):

FS_对象的创建方式如下:

FS_Object fsObject = malloc(sizeof(struct FS_Object));
FolderInfo *folderInfo = &dataList[1]->folderInfo;
free(folderInfo);
folderInfo = NULL;

1.检查元素是否存在

if (dataList[1] != NULL) ...

2.从FS_对象结构中释放FolderInfo结构,如下所示:

FS_Object fsObject = malloc(sizeof(struct FS_Object));
FolderInfo *folderInfo = &dataList[1]->folderInfo;
free(folderInfo);
folderInfo = NULL;

3.免费文件信息:

fileInfo *fileInfo = &dataList[1]->fileInfo;
free(fileInfo);
fileInfo = NULL;

4.最后释放FS_对象结构本身:

free(dataList[1]);
dataList[1] = NULL;

这是正确的方法吗?在尝试释放FolderInfo结构时,我当前遇到以下异常:

*** Error in `./filesystem': free(): invalid pointer: 0x0000000001fa70e8 ***

如果folderInfo是一个裸结构(与指向结构的指针相反),则不需要释放它(它是在malloc FS_对象时分配的)。既然你没有把它弄掉,你就不需要释放它

因此,基本上可以删除第(2)和(3)条中的步骤


检查这个问题:

你的代码中有很多错误,但是我认为这个问题最好在CODReVIEW.StAcExchange .com中被询问。你是一个FSX对象的内存,然后试图在中间释放内存(“FoLDReFipe”)。你不能这样做。很可能您打算将“folderInfo”和“fileInfo”作为指针。不,您的方法不对
folderInfo
fileInfo
嵌套在
FS\u对象中
——它们不是从
malloc
获得的指针,因此不需要释放它们。您应该只使用
释放
FS_对象
实例
malloc
。好的经验法则是,按照malloc存储方式的相反顺序释放所有内容。您的全局数组应该是指针数组,例如
FS_对象*数据列表[100]
。或者您可以将
dataList
声明为
FS\u对象**dataList
,然后为其声明
malloc
空间。