スタックポインタに演算子delete
を使用する必要がありますか?例えばC++は演算子deleteをauto(スタック)ポインタに使用します
:あなたはdelete
を使用する場合
User * p = new User;
delete p; //needed?
スタックポインタに演算子delete
を使用する必要がありますか?例えばC++は演算子deleteをauto(スタック)ポインタに使用します
:あなたはdelete
を使用する場合
User * p = new User;
delete p; //needed?
あなたはポインタを削除していないので、それはそれは、スタックポインタやポインタの他の種類であるかどうか違いはありません。
delete
を使用すると、ポインタが指すメモリブロックが削除されます。そのブロックがnew
で割り当てられた場合は、常にヒープ上にあります。あなたは非ライブラリのコードで裸のポインタを使用することはありませんので(それはnew
に割り当てられていない場合、あなたはdelete
いけない、それは。)
答えの一般的な音色は正しいが、提供される例は非常に間違っている。同じ論理によって、 'delete p'呼び出しの後の' printf( "%d"、* p); 'は同じ未変更の値を出力する可能性が非常に高くなります(pは' int * 'です) p 'は何もしない? – SergeyA
@ SergeyA私はあなたの幸せにするために私の答えからこの例を削除しました。 –
他の角度は、ありません、あなたは使用演算子delete
てはならないということです。
std::unique_ptr<User> p = std::make_unique<User>();
ん
delete
と見えないnew
。
注:この微粒子の場合には、make_unique
は痛みを伴わずnew
の代わりに用いることができるが、他の例であるため、それはないかもしれない、それは自分自身を教えることをお勧めだ - make_unique
使用する機能です。
'new'で割り当てられたものを常に'削除 'します。ポインタはスタックにありますが、ポインタが指すオブジェクトはスタックにありません。 'delete p;'は、ポインタそのものではなく、指示されたオブジェクトを削除します。あなたは['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)や[' std :: shared_ptr'](http:// en。 cppreference.com/w/cpp/memory/shared_ptr)。 –
ポインタを削除していません。割り当てたダイナミックメモリを削除しています。そのアドレスが現在自動ポインタ変数に格納されているという事実は無関係です。 –
'stack'タグはデータ構造' stack'のためのものです。言語としてのC++は、自動的に記憶領域を持つオブジェクトを格納するためのスタックを必ずしも必要としません。 –