所以我是C的新手并创建了一些简单的程序来帮助我解决问题。
假设我有一个结构如下:
typedef struct {
char* field;
} something;
我动态地为其中的10个分配空间,如下所示:
something* stuff = calloc(10, sizeof(something));
假设我想删除这些事情中的一个。这样做是否有意义:
free(&stuff[4]);
或者,如果我把所有这些指针都指向某些东西而不是连续的某些东西,那么这只会有意义吗?
如果我这样做并且有效,那么:
stuff[4] = malloc(sizeof(something))
那么我需要为该索引重新添加“东西”吗?
或者,一般来说,我们通常将这样的结构作为包含指向结构的指针的内存块处理,而不是结构本身吗?
感谢。
答案 0 :(得分:8)
规则很简单。您可以而且应该准确地释放您分配的内容。也就是说,您只能将指向free()
的指针作为malloc
/ calloc
/ realloc
等*的返回值或空指针传递给指针。 其他可以传递给free()
。
所以,你可以释放整个阵列,或者根本没有。
(另请注意,“从中间释放单个元素”将完全没有意义,因为你无法合理地迭代这样一个“神圣”阵列。)如果你想释放一些内存,请分配一个< em> new 范围,复制所需的元素并释放原始数组。
*)一些准标准函数可以间接返回动态分配的内存,你必须自由;检查文档。一些示例是strdup
,GNU的scanf
和GCC的abi::__cxa_demangle
。)
答案 1 :(得分:5)
根据手册页
free()函数释放ptr指向的内存空间,该内存空间必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。
您只能释放整个数据块。所以不要试图释放任何其他东西。