【发布时间】: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