C ++で構造体ノードを宣言した後、次のように宣言します。
n = new node;
また
node n;
これらの表記は両方とも同じものを表していますか?
いいえ。
n = new Node;
はポインタであり、正しいコードは
Node* n = new Node;
または、C ++ 11(2011年に公開された最新のC ++標準であり、最新のGCC 4.7または間もなくリリースされる4.8が非常に近い場合でも、まだいくつかのコンパイラーによって実装されていません)
auto n = new Node;
実際、上記のような生のポインタを使用することは嫌われています。スマートポインタの使用を検討する必要があります。
std::shared_ptr<Node> n = new Node;
指示されたノードは、後で(おそらく間接的に)呼び出すことによって破棄されます
delete n;
(スマートポインタが「魔法のように」それを行うことに注意してください)
だが
Node n;
タイプの変数を宣言しますNode
。そのデータは、現在のスコープの最後(つまり、中括弧を含むNode
最後)で破棄されます。}
RAIIについてもお読みください。
node* n = new node;
ヒープに割り当てられますnode n;
スタックに割り当てられますケース1new
の場合、キーワードを使用してヒープに割り当てるときnode*
は、オブジェクト自体ではなくオブジェクトへのポインターを保存しているため、使用する必要があります。ヒープ割り当ての使用は、現在のスコープ外のオブジェクトを使用する場合に特に便利ですが、キーワードdelete n;
が割り当てられたすべてのオブジェクトを呼び出すことを常に忘れないでください(これらの行に沿って何かを使用している場合を除く)。new
std::shared_ptr
node* make_node()
{
node* n = new node;
n->do_something();
return n;
} // node n does not go out of scope here, but you'll have to call delete on it when you're done
ケース2delete
の場合、オブジェクトはスタックに割り当てられていますが、ここで呼び出す必要はありませんが、これは現在のブロックの最後でスコープ外になります。
void function()
{
node n;
n.do_something();
} // node n goes out of scope here.
std::shared_ptr<memory>
およびその他の機能に関する追加情報。
それらは同じことを表していn
ますが、2番目のケースではスタック上に作成されますが、n
inn = new node;
はヒープストレージ上に作成されます。これは手動で作成する必要がありますdelete
。
また、n
inは、次のn = new node
ように作成されたポインタである必要があります。node* n;