web-dev-qa-db-ja.com

newを使用してオブジェクトをインスタンス化する場合とそうでない場合の違いは何ですか

C++では、

動的なメモリ割り当てとは別に、次の2行のコード間に機能的な違いがあります。

Time t (12, 0, 0); //t is a Time object

Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object

もちろん、Time(int、int、int)アクターが定義されていると仮定しています。また、2番目のケースでは、tがヒープに割り当てられたため、削除する必要があることも認識しています。他に違いはありますか?

96
manzy704

この線:

_Time t (12, 0, 0);
_

...タイプTimeの変数をローカルスコープ、一般的にに割り当てます。スタックはスコープが終了すると破棄されます。

対照的に:

_Time* t = new Time(12, 0, 0);
_

... ::operator new()またはTime::operator new()のいずれかを呼び出してメモリブロックを割り当て、続いてthisをその中のアドレスに設定してTime::Time()を呼び出しますメモリブロック(およびnewの結果として返される)は、tに格納されます。ご存知のように、これは一般的にヒープで行われ(デフォルト)、後でプログラムでdeleteする必要がありますが、tのポインターは- 通常スタックに保存されます。

118
greyfade

もう1つの明らかな違いは、tの変数とメソッドにアクセスする場合です。

Time t (12, 0, 0);
t.GetTime();

Time* t = new Time(12, 0, 0);
t->GetTime();
28
Manoj R

コンストラクターに関する限り、2つの形式は機能的に同じです。新しく割り当てられたオブジェクトインスタンスでコンストラクターが呼び出されるだけです。割り当てモードとオブジェクトの有効期間の違いをすでに十分に把握しているようです。

5
Ates Goral

あなたはすでにすべての違いを理解していると思います。ポインターと変数を介してtのメンバーにアクセスする構文の違いをよく知っていると仮定します(まあ、ポインターも変数ですが、私はあなたが私が意味することを理解していると思います)。また、関数にtを渡すときに、値による呼び出しと参照による呼び出しの違いを知っていると仮定します。また、tを別の変数に割り当て、その別の変数を介して変更を加えるとどうなるかを理解していると思います。結果は、tがポインターかどうかによって異なります。

3
taskinoor

いいえ ..他の違いはありません。

1
liaK

既に知っていることと他の違いはありません。

コードがデフォルト演算子newのサービスを使用していると仮定します。

1
Learner

オブジェクトをスタックに割り当てても、ヒープに割り当てても、オブジェクトに機能的な違いはありません。どちらもオブジェクトのコンストラクターを呼び出します。

ちなみに、ヒープに割り当てるときにも機能的に同等であるboostのshared_ptrまたはscoped_ptrを使用することをお勧めします(scoped_ptrの追加の有用性により、コピーできないポインターのコピーが制限されます)。

scoped_ptr<Time> t(new Time(12, 0, 0));
1
  • Newを使用:演算子new関数を呼び出して動的メモリを取得し、constctor関数を呼び出します。
  • Newを使用しない:constuctor関数を直接呼び出すために、演算子new関数を呼び出しません。スタックは直接使用され、mallocには使用されません。
1
haibo cu