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