2017-07-14 7 views
0

スタックポインタに演算子deleteを使用する必要がありますか?例えばC++は演算子deleteをauto(スタック)ポインタに使用します

:あなたはdeleteを使用する場合

User * p = new User; 
delete p;    //needed? 
+2

'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)。 –

+0

ポインタを削除していません。割り当てたダイナミックメモリを削除しています。そのアドレスが現在自動ポインタ変数に格納されているという事実は無関係です。 –

+0

'stack'タグはデータ構造' stack'のためのものです。言語としてのC++は、自動的に記憶領域を持つオブジェクトを格納するためのスタックを必ずしも必要としません。 –

答えて

2

あなたはポインタを削除していないので、それはそれは、スタックポインタやポインタの他の種類であるかどうか違いはありません。

deleteを使用すると、ポインタが指すメモリブロックが削除されます。そのブロックがnewで割り当てられた場合は、常にヒープ上にあります。あなたは非ライブラリのコードで裸のポインタを使用することはありませんので(それはnewに割り当てられていない場合、あなたはdeleteいけない、それは。)

+0

答えの一般的な音色は正しいが、提供される例は非常に間違っている。同じ論理によって、 'delete p'呼び出しの後の' printf( "%d"、* p); 'は同じ未変更の値を出力する可能性が非常に高くなります(pは' int * 'です) p 'は何もしない? – SergeyA

+0

@ SergeyA私はあなたの幸せにするために私の答えからこの例を削除しました。 –

1

他の角度は、ありません、あなた使用演算子deleteてはならないということです。

は、現代のC++では、あなたの例は次のようになります。

std::unique_ptr<User> p = std::make_unique<User>(); 
delete

と見えないnew

:この微粒子の場合には、make_uniqueは痛みを伴わずnewの代わりに用いることができるが、他の例であるため、それはないかもしれない、それは自分自身を教えることをお勧めだ - make_unique使用する機能です。

関連する問題