4

是否有一种方法/函数可以释放内存而不能将其移动到 c 中的新指针?

谢谢!

4

2 回答 2

4

根据对 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 中指针出处的当前论文

于 2013-08-11T13:33:24.850 回答
-1

据我说不,因为你必须复制到新位置,然后使用 free() 来释放以前的位置。

这是我从你的问题中理解的。

请给出明确的问题。我理解的是@JsQuareD 也从你的问题中理解。

于 2013-08-11T11:58:21.037 回答