2017-05-16 1 views
-1

私は関数を持っており、いくつかのオブジェクトをグローバルリストに保存したいと思います。 両方の方法が正常に動作します。しかし、両方ともヒープ上に変数を作成しますか? それらの違いは何ですか?ヘルプヒープ変数かどうか| *新しいObject()||オブジェクト()?

DrTosh

+1

可能な重複の[なぜC++のプログラマは 'new'の使用を最小限に抑えるべきですか?](0120-1875-100) –

+0

'vector'は' std :: vector 'は、(解放されていないオブジェクトを動的に割り当てるために)最初のメモリをリークし、2番目のメモリは解放しません。両方とも、デフォルトの構築オブジェクトまたはそのコピーをベクターに追加します(関連するコンストラクターがアクセス可能であり、適切に実装されていることが前提です)。 – Peter

答えて

1

を両ベクトルに格納し、ベクター自体がどのように自由ですそれらを保存したいが、通常フリーストアを使用する。大きな違いはしかしあり

vector.push_back(* new object()); 

これは、動的にobjectオブジェクトを割り当て、ベクター中のオブジェクトのコピーを保存し、新たに割り当てられたobjectを指し示すポインタは、その後すぐに破棄されます。

deleteobjectに割り当てたアドレスがnewではないため、後で使用するためにアドレスを保存しないため、この方法ではメモリリークが発生します。

vector.push_back(object()); 

これはあなたのベクトルにオブジェクトを追加する「正しい」方法である、コピーして保存されたベクトルにして、破壊され、一時的なobjectを作成します。

+0

プラス1つ。これは私にとって正しいと思われる。どちらの場合もオブジェクトは作成されコピーされますか? – Bathsheba

+0

違いは、*新しいオブジェクト()は一時的ではないので削除されないということですか? – DrTosh

+0

@DrToshまさに。 –

1

new object()ため

vector.push_back(* new object()); 
vector.push_back(object()); 

tyが動的な記憶域期間を持つ匿名の一時変数を作成します。

* new object()は、new object()からのポインタを保存しないので、単に参照解除してpush_backに渡すだけなので、恐ろしいメモリリークが発生します。

so do notそうです。

一方、object()は、匿名の暫定の自動保存期間のです。

4

これは間違っている:

vector.push_back(* new object()); 

はそれをしないでください。 newはすべてdeleteと一致させる必要があり、あなたはそれを呼び出さないので、メモリがリークしています。あなたができる最良のことは決してnewに電話することではありません。

これはOKです:

vector.push_back(object()); 

しかし、C++ 11には、あなたがより簡単に行うことができます。

vector.emplace_back(/*any constructor args go here*/); 
+1

C++ 11のアプローチに加えて1つ。 – Bathsheba

+0

私はdownvotesを理解していません。私たちはどうしたの? – Bathsheba

-1

は、彼らが


object* temp = new object(); 
vector.push_back(*temp); 

object temp; 
vector.push_back(object); 

それはvectorとは何の関係もありませんが、ちょうど何deleteが呼び出されていない、次のコードに似ています(そして、あなたがすることはできません)

+0

なぜdownvote? –

関連する問題