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