0
我在写一个使用字符数组/字符串的程序。每当我运行该程序,Valgrind的抛出一个“肯定失去了”块警告:分配新的字符数组时发生内存泄漏(c字符串)
==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,上次更改时间的定义,以及姓名(名称为类型为常量字符*)):
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 []名称'应该覆盖它。另外,你有没有考虑过使用std :: string?会更容易管理。另外,我不会打扰tempName变量。我只会使用this-> name char *。 (只是一个样式说明,与正确性无关) – Corbin 2012-04-23 23:33:24
@Corbin,这不起作用。首先,我不能在const char *上使用strcpy,所以我使用tempName作为解决方法。其次,取消注释删除会导致一系列关于未初始化值和无效释放/删除/删除[]的valgrind投诉。 – Tanaki 2012-04-23 23:39:24
对strcpy的第二个争论是一个'const char *'。此外,假设'new'没有错误,你发布的代码中的析构函数中的delete []是正确的(除非你已经将它释放到其他地方)。你能发布整个班级的定义吗? – Corbin 2012-04-24 02:43:24