7

C++リフレッシャーが必要です。なぜこれがメモリ例外を与えるのですか?

pear = new char[1024];
pear = "happy go lucky";
delete [] pear; // exception
4

3 に答える 3

9
pear = new char[1024];

1024文字のメモリはヒープから割り当てられ、ヒープpearの先頭を指します。

pear = "happy go lucky";

pearこれで、読み取り専用セグメントにある文字列リテラルを指し、以前に割り当てられたメモリがリークされます。

delete [] pear;

読み取り専用文字列を解放しようとしました。これは、実行時例外として現れる未定義の動作です。

于 2012-04-26T06:18:37.527 に答える
5

pear="ハッピーゴーラッキー";

これは、によって割り当てられたポインタを置き換えnew char[]ます。したがってdelete[] pear、静的に割り当てられた文字列を解放しようとします。

それは良くないね。deleteで割り当てたものだけを割り当てることができますnew。そして、あなたはそのポインタを上書きした(そして失った)ので、それはできませんdelete

于 2012-04-26T06:18:23.700 に答える
2

pearヒープ上に割り当てられたcharの配列に割り当ててから、静的な場所にある文字列を指すように再割り当てします。それを削除しようとすると、その静的な場所にあるものを削除することになっていないため、エラーが発生します。

于 2012-04-26T06:19:55.927 に答える