文字配列/ c文字列を使用するプログラムを作成しています。私はプログラムを実行するたびに、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、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を残そうとすると、無効なポインタが原因で瞬時にクラッシュします。文字配列でdeleteを呼び出せないのはなぜですか?
b)私は配列に適切な量のメモリを割り当てていると思います。新しい領域を割り当てるときにメモリリークの原因は何ですか?エラーは、プログラムが停止した後(valgrindのHEAP SUMMERY後)に発生します。
デストラクタの 'delete [] name;'はそれをカバーする必要があります。また、std :: stringの使用を検討しましたか?管理しやすくなります。また、私はtempName変数を気にしません。私はthis-> name char *を使うだけです。 (ちょうどスタイルノート、正確さに関係ない) – Corbin
@コービン、これは動作しません。まず、const char *でstrcpyを使用することはできませんので、回避策としてtempNameを使用しています。第2に、削除のコメントを解除すると、初期化されていない値や無効なfree/delete/delete []の不平がつきます。 – Tanaki
strcpyの第2引数は 'const char *'です。また、あなたが投稿したコードは、 'new'がエラーではないと仮定すると、デストラクタのdelete []は正しいです(あなたが既に他のどこかで解放していない限り)。クラス定義全体を投稿できますか? – Corbin