0

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

+0

デストラクタの 'delete [] name;'はそれをカバーする必要があります。また、std :: stringの使用を検討しましたか?管理しやすくなります。また、私はtempName変数を気にしません。私はthis-> name char *を使うだけです。 (ちょうどスタイルノート、正確さに関係ない) – Corbin

+0

@コービン、これは動作しません。まず、const char *でstrcpyを使用することはできませんので、回避策としてtempNameを使用しています。第2に、削除のコメントを解除すると、初期化されていない値や無効なfree/delete/delete []の不平がつきます。 – Tanaki

+0

strcpyの第2引数は 'const char *'です。また、あなたが投稿したコードは、 'new'がエラーではないと仮定すると、デストラクタのdelete []は正しいです(あなたが既に他のどこかで解放していない限り)。クラス定義全体を投稿できますか? – Corbin

答えて

1

私は問題を特定しました。

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

関連する問題