【发布时间】:2012-12-05 21:03:40
【问题描述】:
我想使用 realloc 来增加内存大小,同时保持指针不变(因为调用者使用它)。 realloc 并不总是这样做;有时它会返回一个不同的指针并释放旧指针。我想“尝试”重新分配内存,如果不可能,请使用原始指针回退到不同的方法 - 但 realloc 已经破坏了它!
如果不可能的话,有没有办法在不破坏(如 realloc 一样)旧指针的情况下增加 malloc 的内存?
例如
void *pold;
void *pnew = realloc(pold, newsize);
if (pnew != pold)
{
free(pnew);
DoDifferently(pold); // but pold is freed already
}
附:我不关心可移植性(仅限 Linux,因此是标签)。
【问题讨论】:
-
简短回答:否(好吧,无论如何都不是可移植代码 - 您可能能够深入研究标准库并调用一些未记录的内部函数来使用一个标准库的一个特定版本) .
-
我认为这是重复的。类似(但不是欺骗)问题:stackoverflow.com/questions/6696006/…
-
@Joe:是的,他的观点是尝试重新分配到位,如果这不可能,那就失败吧。
-
@Joe 他想要一个具有这种原型的函数: bool tryrealloc(char * basePtr, size_t newSize);如果内存可以扩展,则该函数返回 True,如果该函数不能但不破坏原始内存的内容(不做任何事情),则返回 False
-
要在扩展区域时保持指针完全相同,需要在对象“之后”有足够的可用空间。运行时系统无法收集其他对象并移动它们以腾出空间,因为这会改变程序背后的它们地址。