文字配列/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、および名前 (名前は 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 を呼び出せないのはなぜですか?
b) 配列に適切な量のメモリを割り当てていると思います。新しい領域を割り当てるときにメモリ リークが発生する原因は何ですか? エラーは、プログラムが停止した後 (valgrind の HEAP SUMERY の後) に発生します。