C++リフレッシャーが必要です。なぜこれがメモリ例外を与えるのですか?
pear = new char[1024];
pear = "happy go lucky";
delete [] pear; // exception
C++リフレッシャーが必要です。なぜこれがメモリ例外を与えるのですか?
pear = new char[1024];
pear = "happy go lucky";
delete [] pear; // exception
pear = new char[1024];
1024文字のメモリはヒープから割り当てられ、ヒープpear
の先頭を指します。
pear = "happy go lucky";
pear
これで、読み取り専用セグメントにある文字列リテラルを指し、以前に割り当てられたメモリがリークされます。
delete [] pear;
読み取り専用文字列を解放しようとしました。これは、実行時例外として現れる未定義の動作です。
pear="ハッピーゴーラッキー";
これは、によって割り当てられたポインタを置き換えnew char[]
ます。したがってdelete[] pear
、静的に割り当てられた文字列を解放しようとします。
それは良くないね。delete
で割り当てたものだけを割り当てることができますnew
。そして、あなたはそのポインタを上書きした(そして失った)ので、それはできませんdelete
。
pear
ヒープ上に割り当てられたcharの配列に割り当ててから、静的な場所にある文字列を指すように再割り当てします。それを削除しようとすると、その静的な場所にあるものを削除することになっていないため、エラーが発生します。