我正在编写一个使用字符数组/ 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之后)发生错误。
答案 0 :(得分:1)
我已经确定了这个问题。
我的问题在于/ default / constructor。由于它没有初始化'name',因此当在默认构造函数创建的对象上调用析构函数时,delete关键字试图删除空指针。我修改了File的默认构造函数,以便将name初始化为'\ 0',这似乎解决了问题。