c - 更安全的重新分配方式

标签 c pointers memory-leaks dynamic-memory-allocation realloc

我正在实现一个函数来安全地重新分配结构,以便在发生任何分配错误时不丢失信息,如下所示:

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 by ptr and returns a pointer to a new object that has the size specified by size. [....]

    [....] 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/

相关文章:

c - 将char指针写入文件,读取文件并检查大小?

c - 绘制回调内绘制和绘制回调外绘制

c - 我收到此警告 : sizeof on array function parameter will return size of 'const char *' instead of 'const char []'

c++ - 在 C++ 中使用指针的不同方式

c++ - 指向类成员的指针有什么用?

iphone - 解析 xml 时 NSCFString appendString 泄漏

c - matlab和C中的内存管理问题

c - 执行 Ansi C 标准检查的 GCC 选项?

c++ - 输出指针的 const 前缀

android - 替换没有 onDestroy 的 fragment