c - c中字符串数组的内存泄漏

标签 c string memory-leaks realloc

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 函数和我用来运行程序的主要函数。

最佳答案

您没有将空指针附加到指针 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 );
}

关于c - c中字符串数组的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42007510/

相关文章:

scala - 这种奇怪的 Scala 内存泄漏的原因是什么?

c# - 线程池/WaitHandle资源泄漏/崩溃

c - 是否存在可以在头文件中定义 C 函数的情况?

c - 为什么这个快速排序有效?

javascript - 如何在 Javascript 中仅将字符串中的数字和/或单词拆分为数组

java - 如何在java字符串中用 '\'替换 '/'

c - 在函数外部使用 3d 数组

c - 仅使用按位运算符以二进制形式执行算术运算

c++ - 为什么我不能将 std::string 与 libcurl 一起使用?

mysql - 与其他 DBMS 相比,MySQL 是否消耗更多资源?