-2

C ++で構造体ノードを宣言した後、次のように宣言します。

n = new node;

また

node n;

これらの表記は両方とも同じものを表していますか?

4

3 に答える 3

3

いいえ。

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についてもお読みください。

于 2013-02-10T08:34:18.950 に答える
2
  1. node* n = new node;ヒープに割り当てられます
  2. node n;スタックに割り当てられます

ケース1newの場合、キーワードを使用してヒープに割り当てるときnode*は、オブジェクト自体ではなくオブジェクトへのポインターを保存しているため、使用する必要があります。ヒープ割り当ての使用は、現在のスコープ外のオブジェクトを使用する場合に特に便利ですが、キーワードdelete n;が割り当てられたすべてのオブジェクトを呼び出すことを常に忘れないでください(これらの行に沿って何かを使用している場合を除く)。newstd::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> およびその他の機能に関する追加情報。

于 2013-02-10T08:33:12.073 に答える
1

それらは同じことを表していnますが、2番目のケースではスタック上に作成されますが、ninn = new node;はヒープストレージ上に作成されます。これは手動で作成する必要がありますdelete

また、ninは、次のn = new nodeように作成されたポインタである必要があります。node* n;

于 2013-02-10T08:33:05.193 に答える