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之后)发生错误。

+0

析构函数中的'delete []名称'应该覆盖它。另外,你有没有考虑过使用std :: string?会更容易管理。另外,我不会打扰tempName变量。我只会使用this-> name char *。 (只是一个样式说明,与正确性无关) – Corbin 2012-04-23 23:33:24

+0

@Corbin,这不起作用。首先,我不能在const char *上使用strcpy,所以我使用tempName作为解决方法。其次,取消注释删除会导致一系列关于未初始化值和无效释放/删除/删除[]的valgrind投诉。 – Tanaki 2012-04-23 23:39:24

+0

对strcpy的第二个争论是一个'const char *'。此外,假设'new'没有错误,你发布的代码中的析构函数中的delete []是正确的(除非你已经将它释放到其他地方)。你能发布整个班级的定义吗? – Corbin 2012-04-24 02:43:24

回答

1

我已经确定了这个问题。

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