所以我对C很陌生,并创建了一些简单的程序来帮助我掌握一些窍门。
假设我有如下结构:
typedef struct {
char* field;
} something;我动态地分配了10个空间,如下所示:
something* stuff = calloc(10, sizeof(something));假设我想删除其中的一个东西。这样做有意义吗:
free(&stuff[4]);或者,只有当我把所有这些指点都指向某些事物,而不是一连串的某些事物时,这才有意义吗?
如果我这么做了,成功了,会:
stuff[4] = malloc(sizeof(something))那么,我只需要在索引中重新添加一个“东西”?
或者,一般来说,我们是否通常处理这样的结构,比如包含指向结构的指针的内存块,而不是结构本身?
谢谢。
发布于 2013-07-01 23:43:42
规则很简单。你可以而且应该完全释放你分配的东西。也就是说,您必须只将指针传递到作为malloc/calloc/realloc等的返回值接收到的free(),或者是一个空指针。其他任何东西都不能传递给free()。
因此,您可以释放整个数组,或者什么也不释放。
(还请注意,“从中间释放一个元素”是完全没有意义的,因为您无法明智地迭代这样一个“神圣”数组。)如果要释放某些内存,请分配一个新的范围,复制所需的元素并释放原始数组。
*)一些准标准函数可能间接返回必须重新分配的动态内存;检查文档。一些例子是strdup,GNU的scanf和GCC的abi::__cxa_demangle。
发布于 2013-07-01 23:44:31
根据手册页
函数释放ptr所指向的内存空间,该内存空间必须通过以前对malloc()、calloc()或realloc()的调用返回。否则,或者如果以前已经调用了空闲(Ptr),则会发生未定义的行为。
您只能释放整个数据块。所以不要试图释放任何其他东西。
https://stackoverflow.com/questions/17415330
复制相似问题