【问题标题】:Memory Leak when Allocating a New Char Array (c string)分配新字符数组(c 字符串)时的内存泄漏
【发布时间】:2012-04-23 23:30:25
【问题描述】:

我正在编写一个使用字符数组/c 字符串的程序。每当我运行程序时,valgrind 都会抛出一个“肯定丢失”的块警告:

==8011== [X] bytes in [Y] blocks are definitely lost in loss record 1 of [Z]
==8011==    at 0x4A065BA: operator new[](unsigned long) (vg_replace_malloc.c:264)
==8011==    by 0x403D45: File::File(stat*, char const*) (File.cpp:15)
...

这是构造函数和析构函数的源代码(标头包含 id、isDir、lastModified 和 name 的定义(名称为 const char* 类型)):

10  File::File(struct stat *statdat, const char* strName)
11  {
12    id = statdat->st_ino;
13    isDir = S_ISDIR(statdat->st_mode);
14    lastModified = (statdat->st_mtime);
15    char* tempName = new char[strlen(strName)+1];
16    strcpy(tempName, strName);
17    name = tempName;
18    tempName = NULL;
19  }
20  
21  File::~File()
22  {
23    //delete [] name;
24  }

我对此有几个问题。

a) 在编译和运行时尝试在析构函数中保留 delete 会由于指针无效而导致即时崩溃。为什么我不能在字符数组上调用 delete?

b) 我认为我正在为数组分配适量的内存。分配新空间时导致内存泄漏的原因是什么?该错误发生在程序停止后(在 valgrind 的 HEAP SUMMERY 之后)。

【问题讨论】:

  • 析构函数中的delete[] name; 应该覆盖它。另外,您是否考虑过使用 std::string?会更容易管理。另外,我不会打扰 tempName 变量。我只会使用 this->name char*。 (只是样式说明,与正确性无关)
  • @Corbin,这不起作用。首先,我不能在 const char* 上使用 strcpy,所以我使用 tempName 作为解决方法。其次,取消注释删除会导致一堆关于未初始化值和无效 free/delete/delete[] 的 valgrind 抱怨。
  • strcpy 的第二个参数是const char *。此外,您发布的代码,假设 new 没有出错,析构函数中的 delete[] 是正确的(除非您已经在其他地方释放它)。你能发布整个类定义吗?

标签: destructor memory-leaks valgrind cstring dynamic-memory-allocation


【解决方案1】:

我已经确定了问题。

我的问题在于 /default/ 构造函数。由于它没有初始化“名称”,因此当在默认构造函数创建的对象上调用析构函数时,delete 关键字试图删除空指针。我修改了 File 的默认构造函数,以便将 name 初始化为 '\0',这似乎解决了问题。

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 2011-05-04
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2013-04-03
    • 2021-05-01
    相关资源
    最近更新 更多