【问题标题】:freeing pointer passed to function where it was allocated释放指针传递给分配它的函数
【发布时间】:2013-11-14 18:46:30
【问题描述】:

我有一个函数,其中 malloc 用于分配一个指针,指针传递给另一个函数,然后传递给另一个函数,最后使用它。

我的问题是,我可以在最终函数中为分配的指针调用 free 吗?或者我需要调用调用 malloc 的函数。

面临的问题是,我们看到内存泄漏,因为这个分配的指针的 free 直到日期都没有编码。所以我现在的工作就是修复内存泄漏。

【问题讨论】:

    标签: c pointers malloc free


    【解决方案1】:

    你可以做任何一个,但不能同时做。设计通常最好在分配内存的同一函数中释放内存。

    【讨论】:

    • 如果我释放它分配的指针,返回的指针不会变成 NULL 吗?我可能会结束损坏的指针
    • 您必须在不再需要时释放内存。分配 - 调用函数 - 免费。
    • 对,所以我需要在我用完它后再释放它
    【解决方案2】:

    严格来说,你可以在任何地方释放它,只要你释放它恰好一次并且在最后一次使用之后。 1MM 的问题是,根据未来的使用情况,您如何轻松执行此操作?传递具有所有权转移语义的指针通常是不好的。通常,使用分配转移返回指针也很糟糕。如果您设计 API,请考虑抽象分配的对象并具有分配/释放功能(例如 allocate_widgetfree-widget)。 API使用不应该知道widget是用malloc()分配的,必须用free()释放。

    【讨论】:

      【解决方案3】:

      您可以在最终函数中为该分配的指针调用 free,但这不是一个好习惯。好的做法是在拥有指向已分配内存的主指针(可能不是分配内存的函数)的函数内部调用 free 函数。 这是一个例子:

      void func() 
      {
          void* ptr = malloc(...); // ptr variable declared and initialized here.
          func2(ptr);
          func3(ptr);
          func4(ptr);
          free(ptr); // Free memory in function where ptr is declared.
      }
      

      或者,如果 mallocfree 被封装在更高级别的函数中:

      void func() 
      {
          void* ptr = allocateObject(...); // This function calls "malloc".
          func2(ptr);
          func3(ptr);
          func4(ptr);
          freeObject(ptr); // This function calls "free".
      }
      

      还要考虑 C free 函数释放动态分配的内存,但不要更改 ptr 变量值。 因此,如果您遇到内存泄漏,一个好的做法是在调用free 之后将指针变量设置为NULL。通过这种方式调试代码,您可能会立即知道是否分配了内存 (ptr != NULL) 或没有分配内存 (ptr == NULL)

      if(ptr != NULL) 
      {
          free(ptr);
          ptr = NULL;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        相关资源
        最近更新 更多