0

我正在编写一个使用字符数组/ 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?

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

4

1 回答 1

1

我已经确定了这个问题。

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

于 2012-04-24T15:15:27.230 回答