有没有一种在C语言中释放内存的方法/函数,而不可能将其移动到新指针?
谢谢!
有没有一种在C语言中释放内存的方法/函数,而不可能将其移动到新指针?
谢谢!
realloc函数释放由ptr指向的旧对象,并返回一个指向具有指定大小的新对象的指针。(C99 7.20.3.4:2)
然而,在我的系统中,realloc() man页上写道:如果没有足够的空间来扩大ptr指向的内存分配,则realloc()创建一个新的分配,将由ptr指向的旧数据的尽可能多的部分复制到新的分配中,释放旧分配,并返回分配的内存的指针。
这或多或少意味着,仅在用于扩大块时,realloc()只能移动数据并返回新指针。这表明在此平台上,可以使用realloc()来缩小从malloc()获得的块的大小而无需移动它。uintptr_t save = old;
void * new = realloc(old, …);
assert (save == (uintptr_t) new);
这些预防措施并非没有道理,例如观察一下在这个非正式未定义行为比赛中的第二名。
2021年编辑:多年之后,更进一步的重新解释和演变C语言定义为高级语言的努力意味着即使以上三行都是合法的,即使执行它们后,您也不能使用旧版old
来访问由new
指向的块,尽管这些指针指向同一位置。请参见有关C语言指针来源的当前论文。
realloc
返回NULL
,则您的旧指针未更改。否则,应使用新指针。赋值比分支和可能的赋值更快,因此请在确保新指针不为NULL
后将新指针分配给旧指针。如果它为NULL
,则数据仍在旧指针中,并且可以安全地访问,尽管它没有调整大小。在这种情况下所做的操作取决于重新分配的上下文和意图。 - user539810