我正在实现一个函数来安全地重新分配结构,以便在发生任何分配错误时不丢失信息,如下所示:
int foo (someStruct_t *ptr, int size)
{
someStruct_t *tmp_ptr;
tmp_ptr = realloc(ptr, size);
if (tmp_ptr == NULL)
return -1;
ptr = tmp_ptr;
return 0;
}
我的疑问在于:每次运行此函数时,我是否都没有为结构复制分配的内存?按照我的想法,我应该在退出之前释放其中一个指针,对吗?
最佳答案
这里的主要问题是,在调用 foo()
之后,在调用者中,传递给 ptr
的参数不会改变,因为它本身按值传递。
如果您不想返回
新指针,则需要将指针传递给要重新分配的指针。
也就是说,这里没有内存的“重复”。
从
realloc()
的角度来看realloc()
,如果成功,则返回指向新内存的指针并处理旧内存的解除分配工作。您无需担心任何重复或内存泄漏。引用
C11
,第 7.22.3.5 章(强调我的)The
realloc
function deallocates the old object pointed to byptr
and returns a pointer to a new object that has the size specified bysize
. [....][....] If memory for the new object cannot be allocated, the old object is not deallocated and its value is unchanged.
从分配的角度来看
像
ptr = tmp_ptr;
这样的语句不会复制指针指向的内存或内存内容,它只是拥有相同指针的两个副本。例如,您可以将它们中的任何一个传递给free()
。
所以,归根结底,要回答问题中的“问题”,
In my line of thought I should free one of the pointers before exiting, correct?
不,你不应该。您需要让新分配的指针在调用方中有用,free()
- 在被调用函数中使整个函数变得毫无意义。不过,您应该从调用者那里释放指针。
关于c - 更安全的重新分配方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43653870/