是否有一个方法/函数可以释放内存而无法将其移动到c中的新指针?
谢谢!
答案 0 :(得分:3)
根据对C99标准的严格解释,对realloc()
的任何调用(包括减小分配块的大小)都可能返回与参数不同的指针。实际上,根据对标准的严格解释,不允许将旧指针与新指针进行比较,因为将旧指针传递给realloc()
会使其所有现有副本都不确定。
realloc函数释放ptr指向的旧对象并返回一个 指向具有size指定大小的新对象的指针。 ......(C99 7.20.3.4:2)
但是,我系统上realloc()
的手册页说:
如果没有足够的空间 扩大ptr指向的内存分配,realloc()创建一个新的 分配,复制尽可能多的ptr指向的旧数据 到新的分配,释放旧的分配,并返回一个指针 分配的内存。
这或多或少意味着realloc()只能在用于放大块时移动数据并返回新指针。这表明,在此平台上,realloc()
可用于减少从malloc()
获得的块的大小,而不会有移动它的风险。
如果我要使用realloc()
来减少已分配块的大小而不移动它,我会使用下面的检查:
uintptr_t save = old;
void * new = realloc(old, …);
assert (save == (uintptr_t) new);
这些预防措施并非一无所获,例如参见this informal undefined behavior competition中的获胜者#2。
答案 1 :(得分:-1)
据我说不,因为您必须复制到新位置然后使用free()来释放以前的位置。
这是我对你的理解。
请提出明确的问题。我理解的是@JsQuareD也从你的问题中理解。