-1

質問するのはこれが初めてです。私は外国人なので、私の質問を説明するのは少し難しいです。多分私のタイトルも間違っている...コードを見てみましょう:

クラスを定義したとします。

class Test
{
    public:
        Test();
};

int main()
{
     Test *pointer = new Test(); //what's the difference between these two ways, 
     Test test;                  //if  the two ways are the same, which one is better under what
     pointer = &test;            //circumstance? 
}

皆さんが私の言っていることを理解し、助けてくれることを願っています。

4

3 に答える 3

5
Test *pointer = new Test();

フリーストアTest(一般にヒープとして知られている) にオブジェクトを作成します。オブジェクトは、によって返されたアドレスを明示的に呼び出すまでメモリ内に保持されます。これは、動的に割り当てられたオブジェクトとして知られています。deletenew

Test test;

自動ストレージTestにオブジェクトを作成し、オブジェクトが作成されたスコープ ( , ) が終了すると割り当てが解除されます。メモリは自動的に (暗黙的に) 割り当て解除されるため、Automaticという名前が付けられています。(RAII) C++ で{}

いつどちらを使用するのですか?

  • オブジェクトが作成されたスコープを超えて永続化したい場合は、 を使用する#1か、 を使用します#2
  • 通常、スタック サイズは制限されているため、オブジェクトが多くのメモリを占有する場合、スタック スペースが不足する可能性があります#1

したがって、どちらを使用するかは、手元の状況によって異なります。ただし、通常、C++ では、の使用をnew最小限に制限し、必要な場合にのみ使用することに注意してください。

よく読んでください:
C++ プログラマーが「new」の使用を最小限に抑える必要があるのはなぜですか?

于 2012-08-28T04:09:49.460 に答える
2
Test *pointer = new Test(); 

メモリを解放しないため、メモリリークです。オブジェクトはヒープ上に作成されます。

Test test;

オブジェクトはスタック上に作成されます。最後の中括弧に達すると、オブジェクトが削除されます。それは「範囲外」になります。

どちらが「より良い」かは、ニーズによって異なります。

于 2012-08-28T04:07:23.160 に答える
1

Test test;スタック上にオブジェクトを作成します。function に対してローカルであり、終了main時に自動的に割り当て解除されます。main現在のブロック内のオブジェクトのみを使用する必要がある場合に使用します。

Test *pointer = new Test();宣言されているブロックに限定されない有効期間で、ヒープ上にオブジェクトを作成します。この方法でオブジェクトを宣言すると (使用してnew)、ある時点でdeleteオブジェクトを呼び出す必要が生じるか、メモリ リークが発生するため、メモリ管理を処理するという追加の負担が発生します。これは、現在の関数を超えて、コードの他の部分などに固執する必要があるオブジェクトを作成する必要がある場合に使用します。

これらの点を考慮すると、次のコードには問題があります。

Test *pointer = new Test();
Test test;
pointer = &test;

pointerへの参照に代入すると、割り当てtestたオブジェクトへのポインタが失われ、メモリ リークが発生します。pointerさらに、オブジェクトへの参照を返す関数など、他の場所で使用する可能性のあるコンテキストでこれを行うTestと、関数の終了後に無効なメモリ アドレスがポイントされます。

于 2012-08-28T04:10:57.587 に答える