【问题标题】:Memory leak with string arrays in cc中字符串数组的内存泄漏
【发布时间】:2017-06-19 20:05:09
【问题描述】:
char **add_string(char **existing, const char *string){
  size_t size = 0;
  while (NULL != existing[size]) 
    {
      ++size; 
    }
  char **arr = realloc(existing, (size + 2) * sizeof *arr);
  arr[size] = malloc(strlen(string) + 1);
  strcpy(arr[size], string);  
  arr[size+1] = '\0';
  return arr;
}

void free_strings(char **strings)
{
  size_t size = 0;
  while (NULL != strings[size]) 
  {
    free(strings[size]);
    ++size;
  }
}

我在行发生内存泄漏

char **arr = realloc(existing, (size + 2) * sizeof *arr);

我认为在使用 realloc 时应该释放现有内存?如何修复此内存泄漏?

编辑:添加了我的 free_string 函数和我用来运行程序的 main。

【问题讨论】:

  • 稍后释放数组的代码在哪里?泄漏检查工具可能会指出分配泄漏内存的位置,但它无法向您显示应该释放它的位置......这可能是缺少的。如果realloc() 成功,它要么给你相同的块,要么释放旧的块并分配一个新的块......但你仍然需要在稍后的某个时候释放新的(或重用的)块。
  • 你为什么用 (size+2) 而不是 (size+1)?
  • @odin 他获取大小的方式不包括最终的 NULL 指针......所以他必须为 NULL 添加 2、1 和为新字符串添加 1。尽管他应该将最后一个指针设置为 NULL 而不是 '\0'
  • @Dmitri 我添加了我的释放功能和我正在使用的主要功能。
  • 您的释放函数会释放数组中的字符串,但不会释放外部数组本身......这就是它泄露的原因。将free(strings); 添加到末尾应该可以解决它。

标签: c string memory-leaks realloc


【解决方案1】:

您没有将指针existing 指向的数组附加空指针。因此在这个循环中

while (NULL != existing[size]) { ++尺寸; }

函数具有未定义的行为。

你的意思好像是下面这个

char ** add_string( char **existing, const char *string )
{
    size_t size = 0;

    while ( NULL != existing[size] ) ++size; 

    char **arr = realloc( existing, ( size + 2 ) * sizeof *arr );

    if ( arr != NULL )
    {
        arr[size] = malloc( strlen( string ) + 1 );
        strcpy( arr[size], string );  
        arr[size+1] = NULL;
    }

    return arr;
}

函数free_strings 也不正确。它应该看起来像

void free_strings( char **strings )
{
    size_t size` = 0;

    do
    {
        free( strings[size] );
    } while ( strings[size++] != NULL );

    free( strings );
}

【讨论】:

  • 我需要重新分配 size+2 因为我必须为 arr[size] 和 arr[size+1] 留出空间
  • 谢谢,我从来没有释放实际的字符串本身。
  • @RoomMates 我看不出你需要在哪里添加两个元素而不是一个,因为你只插入一个字符串。
  • @VladfromMoscow size 的值是通过计算非 NULL char 指针获得的,所以它是字符串的数量——而不是数组的全长(不包括最终NULL 指针)。他需要空间容纳更多的字符串,再加上最后的NULL...所以他在size 上加了2。
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2011-08-29
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多