【问题标题】:Free a pointer to a pointer释放指向指针的指针
【发布时间】:2012-09-17 05:05:07
【问题描述】:

假设有一个函数,它接收缓冲区的东西,并且可能需要将内存分配给函数范围内的缓冲区。它可能看起来像这样:

void func_with_buf( ...params..., char** buf ) {

    if ( !buf ) {
       buf = ( char** )calloc( ... );
    }

    /* more stuff here */
    ...
} 

现在,稍后在这个函数中有另一个条件语句,它的计算结果为 false,如果在 if/条件语句中返回 false,则应该释放 buf 指向指针的指针,因为什么都做不了函数本身的更多内容。

所以,有两种方法可以解决这个问题,我想知道哪一种在可扩展性、重用等方面会被认为“更安全”和更实用。

方法 A)

char* buf;

if ( !func_with_buf( ..., &buf ) ) {

   free( buf );
   buf = NULL;
   /* more error handling here */
}

方法 B)

char* buf; 

if ( !func_with_buf( ..., &buf ) ) {
    /* no need to free buf because func_with_buf handles deallocation internally. */
} 

有些事情告诉我,方法 A) 将是推荐的方法,但我很好奇,想看看我是否看过任何东西。

另外,如果程序员需要释放一个指向指针的指针,是否只需将它传递给free(p) 并且它会处理它?还是我需要将其转换为相同类型的单个指针?

这么多问题……

【问题讨论】:

    标签: c pointers memory-management buffer double-pointer


    【解决方案1】:

    方法(C)

    char* buf = func_with_buf( ..., buf );
    

    这样你传入原始 buf 但返回新的或 buf,如果出现问题返回 NULL(并在函数中清理)。

    【讨论】:

      【解决方案2】:

      我认为两者都可以接受,只要在函数描述中非常清楚。

      就个人而言,如果我有一个分配内存的函数并且由于某种原因失败了,我觉得它有义务释放该内存。如果调用者收到指示内存无用的错误条件,他们应该期望它也已被释放。

      或者换一种说法,只有函数指示成功,内存才有效。

      顺便说一句,在你的函数中你正在这样做:

      buf = ( char** )calloc( ... );
      

      但我认为你是故意这样做的:

      *buf = ( char* )calloc( ... );
      

      您要求调用者提供一个您将修改的指针。所以他们传递了一个指向他们的指针的指针,但他们需要的实际数据类型是char的数组。

      至于你的最后一个问题(对不起,我一开始没看到),不——你不需要投射它(除非你想投射到void*)。函数free 只是获取一个内存地址并释放那里分配的任何内存。它不需要类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多