分配新的Char数组时的内存泄漏(c string)

时间:2012-04-23 23:30:26

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

我正在编写一个使用字符数组/ 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(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之后)发生错误。

1 个答案:

答案 0 :(得分:1)

我已经确定了这个问题。

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