3

私はC ++を初めて使用し、現在キーワードを勉強newしています。delete

Point ppaa = *new Point;
Point *p = &ppaa;

ppaa.xpos = 1;
ppaa.ypos= 3;

delete &ppaa;
delete p;

&ppaa を使用して上記の ppaa を削除できない理由を教えてください。削除はポインターでしか操作できないことは知っていますが、実際にはメモリの場所であるため、上記が不可能な理由がわかりません。同様の質問を検索すると、これは最初の行で発生するコピー操作に関連しているようですが、適切な説明がありません。

4

1 に答える 1

3
 T t = x;

コピーの初期化と呼ばれます。これ:

  • &x型のオブジェクトに変換しようとします。T
  • 次に、そのオブジェクトを to-initialized object にコピーしますt

だからあなたのコードステートメント、

Point ppaa = *new Point;
  • Pointfreestore/heap にオブジェクトを作成し、
  • 次に、そのオブジェクトをコピーしてスタック オブジェクトを作成しますppaa

これらのオブジェクトは両方とも異なるオブジェクトです。
ご覧のとおり、このステートメントを実行した後、ヒープ オブジェクトへのポインターはもうありません。この場合、 によって返された
アドレスを渡す必要があります。アドレスがもうないため、メモリ リークが発生します。また、スタック上にあるオブジェクトのアドレスを返すことによって返されるアドレスを返さないこと に注意してください。このアドレスをに渡すと、未定義の動作が発生します。これは、スタック ベースのローカル/自動オブジェクトであるフリーストア/動的に割り当てられていないためです。newdelete
&ppaanewppaadeleteppaa

于 2012-11-03T05:10:37.817 に答える