0

文字配列/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 の後) に発生します。

4

1 に答える 1

1

問題を特定しました。

私の問題は /default/ コンストラクターにありました。'name' が初期化されなかったため、デストラクタがデフォルト コンストラクタによって作成されたオブジェクトで呼び出されたときに、delete キーワードがヌル ポインタを削除しようとしていました。名前を '\0' に初期化するために、File の既定のコンストラクターを変更しました。これにより、問題が解決したようです。

于 2012-04-24T15:15:27.230 に答える