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',這似乎解決了問題。