是否有一种方法/函数可以释放内存而不能将其移动到 c 中的新指针?
谢谢!
根据对 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);
这些预防措施并非没有意义,例如,请参阅此非正式未定义行为竞赛中的获胜者#2 。
2021 年编辑:然而,多年后,进一步努力将 C 的定义重新解释和发展为高级语言的定义,这意味着即使上述三行中的任何一行都是完全合法的,即使在执行它们之后,您也不能使用旧的的副本old
访问由 指向的块new
,即使这些指针指向同一个地方。请参阅有关 C 中指针出处的当前论文。
据我说不,因为你必须复制到新位置,然后使用 free() 来释放以前的位置。
这是我从你的问题中理解的。
请给出明确的问题。我理解的是@JsQuareD 也从你的问题中理解。