2016-08-06 7 views
0

なぜこのコードの結果がヒープの破損になるのか誰かが説明できますか?ポインタを削除するとヒープの破損が発生する

string someText = "hello hello"; 
char **arrayOfCharPtr = new char*[5]; 
arrayOfCharPtr[0] = new char[someText.length()]; 
strcpy(arrayOfCharPtr[0], someText.c_str()); 
delete[] arrayOfCharPtr[0]; 

ありがとうございます!

+1

あなたの配列は1文字短いです、 'strcpy'によってヌル文字がコピーされるスペースはありません。 – user657267

+0

Ok、length()+ 1しかし、なぜこれがメモリリークを引き起こしますか? strcpy行自体はエラーを起こさない。それを引き起こすのは削除行です。 arrayOfCharPtr [0]の内容がどれだけ長くても、それを削除できないのはなぜですか? – Johan

+1

"strcpy行自体はエラーを起こさない"未定義の動作へようこそ。物事はうまくいくように見えますが、ソースから数キロ離れた場所で爆発します。 – user657267

答えて

3

最後の '\ 0'文字を格納する文字列の長さよりも1文字を割り当てる必要があります。

arrayOfCharPtr[0] = new char[someText.length()+1]; 

strcpyは、割り当てられたブロックの後に最後の '\ 0'を書き込み、ヒープを破損します。

valgrindのようなツールを理解するのに役立ちます。 valgrindは、エラーの原因をローカライズするエラーメッセージ

==16970== Invalid write of size 1 
==16970== at 0x4C3106F: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==16970== by 0x400C47: main 
==16970== Address 0x5ab5cfb is 0 bytes after a block of size 11 alloc'd 
==16970== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==16970== by 0x400C1C: main 

を生成します。

関連する問題