4

このページには、

1つの理由は、deleteのオペランドが左辺値である必要がないことです。検討:

delete p+1; 
delete f(x); 

ここで、deleteの実装には、ゼロを割り当てることができるポインターがありません。

ポインタに数値を追加すると、それらの数のsizeof(*p)単位だけメモリ内で前方にシフトします。

delete pでは、との違いは何ですか。delete p+1また、ポインタを作成する0だけで問題が発生するのはなぜdelete p+1ですか。

4

4 に答える 4

8

あなたはできませんp + 1 = 0。同じ理由で、delete p + 1削除すると、そのオペランド(p + 1)をゼロにすることはできません。これは、StroustrupのFAQの質問に関するものです。

あなたがプログラムで書く可能性delete p+1は非常に低いですが、それは重要ではありません...

于 2010-04-17T02:28:21.397 に答える
5

sizeof(*p)あなたが正しく単位を離して言ったように、pとp+1は異なる場所を指しています。割り当てられていないものを削除することはできませんが、たとえば次のようになります。

A* p = new A();
p++;
delete p-1;

元の割り当てを削除します。p+1が最初に割り当てられなかったときにp+1を削除することは、未定義です。glibは次のように表示されます。

*** glibc detected *** free(): invalid pointer: 0x0804b009 ***

p + 1は変更する変数ではないため、実装はp+1をゼロにすることはできません。段落はそれを言っていました

delete p;

に翻訳することができます

free(p);
p = 0;

それはp+1では意味がありません

于 2010-04-17T02:26:53.897 に答える
1

実際には、右辺値を使用できます。 delete仕様 (n3242) にはそれを排除するものはありません。実際には、エラーは発生しません。

記事が言うならところで

delete のオペランドは左辺値である必要はありません

これは、左辺値である場合とそうでない場合があることを意味します。オペランドを左辺値にできないとは言っていません。

于 2012-09-29T00:50:45.620 に答える
0

その理由は、どちらも左辺値ではないため、NULL(またはその他の値)に設定することは不可能であるためです。

于 2010-04-17T02:26:41.540 に答える