次のようなことをしても安全ですか。
char* charArray = new char[10];
strcat(charArray, "qwertyuiop");
charArray[3] = '\0';
delete [] charArray;
すべて削除されますか?それとも、後にあるものは\0
ありませんか?ゴミを捨てているかどうかはわかりません。
編集:する必要がありますstrcpy
new[]
PODタイプの場合、配列をゼロ初期化せず、割り当てられた領域の終わりを超えてstrcat
終了を書き込むという事実を除けば、すべてが正常に見えます。特に、ブロック全体が削除されます。'\0'
delete
割り当てられたブロックの終わりを超えて書き込む理由は、10文字の文字列"qwertyuiop"
を格納するために11バイトが必要なためです。
strcpy
の代わりに書きたい場合はstrcat
、それは安全で正しいです。しかし、あなたはについて誤解しているようですdelete [] charArray
。文字を削除するのではなく、が指すメモリを削除しますcharArray
。後でもメモリにそれらの文字delete [] charArray
が含まれている可能性がありますが、それは保証されていません。
ただし、本当に書きたい場合で、タイプミスではない場合は、2番目の文字列を連結しようとするガベージが含まれているstrcat
ため、コードは未定義の動作を呼び出します。charArray
strcat
内のdelete[]
オブジェクトを破棄した後、割り当てられたメモリを解放します (これは に対して何もしませんchar
)。コンテンツは気にしません。つまり、割り当てられた数のオブジェクトを解放します。
strcat()
の使用は、文字列の末尾を見つけるためにヌル文字に依存していること、および返されるメモリが初期化されていないことに注意してくださいnew char[n]
。から始めたい
*charArray = 0;
...そして、検討strncat()
するか、さらに良いことに、これをまったく使用せずに使用することをお勧めしますstd::string
。
いいえ、これで問題ありません。アレイ全体が削除されます。delete
あなたがそれを指すポインタが何を指しているのかを見ていません。、およびと一致new
する限り、適切な量のメモリが解放されます。delete
new[]
delete[]
(ただしstd::string
、char配列の代わりに使用することを検討してください。これにより、配列の終わりを超えて記述しているような多くのバグを回避できます。)
このdelete[]
ステートメントは、バッファーに何が格納されているか(文字列であるかどうかを含む)については何も知らないため、10文字すべてを削除します。ただし、strcat
呼び出しは配列の最後をオーバーフローしています(C文字列のターミネータはゼロバイトであるため)。これにより、プラットフォームでの削除が中断される可能性があり、一般的に安全ではありません。