2011-01-06 1 views
0
class AClass 
{ 
    // ... 
} 

ダイナミックメモリ割り当てを行わずにクラスのオブジェクトをベクトルに追加するにはどうすればよいですか?

class AnotherClass 
{ 
    public: 
     // ... 
     void AMethod() 
     { 
      // ... 
      AClass * ac = new AClass(); // Dynamic memory allocation here 
      m_Objects.push_back(ac); 
      // ... 
     } 
     // ... 
    private: 
     // ... 
     std::vector<AClass *> m_Objects; 
     // ... 
} 

私はベクトルm_ObjectsAClassの新しいオブジェクトを追加したいです。
ダイナミックメモリ割り当てを行わずにこれを行う方法はありますか?

+3

なぜ 'AClass'オブジェクトへのポインタではなく、' AClass'オブジェクトをベクトルに格納しないのですか? (はい、 'vector'の基礎となる記憶域には動的割り当てがありますが、個々の要素には割り当てられません) –

+1

動的メモリ割り当てをしたくない理由はありますか? –

+1

@サンジット:それは非常に望ましいものではないので。メモリリークの原因となることがあります。 – hkBattousai

答えて

4

は、ここでは、動的メモリ割り当てを引き起こして二つあります。

最初の手順は、が常に保持するオブジェクトの最大数であるAnotherClassコンストラクタでm_Objects.reserve(N);を呼び出すことです。これにより、動的割り当ての必要性を除去するのに十分なメモリが予約されます(vector::push_back)。

第2ステップでは、m_Objectsにポインタの代わりにオブジェクトが含まれるようにします。つまり、std::vector<AClass*>の代わりにstd::vector<AClass>と入力します。これは、あなたがnewをスキップして、直接の容器を成長させることによって、新しいオブジェクトを作成することができます:今すぐ

m_Objects.resize(m_Objects.size() + 1); 

新しいオブジェクトを追加するとき、動的な割り当ては行われません。

2

「動的割り当てを行わずに実行時に新しいオブジェクトを作成できますか?答えはいいえです。それが動的割り当てです。

前もって一括して作成する必要がある前に作成したい場合は、それがもっともらしいです。単純に大きな数を割り当て、必要に応じて配列やベクトルからそれらを引き出します。

+0

@Keith Irwin:実行時に作成したいです。 – hkBattousai

+0

@hkBattousai:それは動的割り当ての定義です。 –

+1

@Tomalak:通常、動的割り当てはヒープからメモリを割り当てることを意味します。メモリの割り当てとオブジェクトのインスタンス化は、2つの別々のものです(通常は一緒になっても)。新しいプレースメントを検索してください。 –

1

ない限り、あなたが自動(スタック)変数へのポインタを格納していた場合を除きm_Objectsは、ポインタvectorあるとして。しかし、それは間違いなく、非常に悪い考えです。

1

実行時にオブジェクトを割り当てる方法は、動的にヒープ上と呼び出しスタック上に2つしかありません。

関数ブロック内のローカル(自動)変数である複数のオブジェクトを再帰的に呼び出し、それらのスタックオブジェクトをベクトルに追加することでインスタンス化することができます。しかし、私はあなたが本当に望むものではないと確信しています。

これは、newを使用して新しいオブジェクトを動的に作成するという唯一の方法だということを意味します。

  1. vector::push_back
  2. new AClass()

はここで動的なメモリ割り当てを減らすためにどのように1つのアイデアです:

+1

ヒープとスタックは、保存期間の点で紛らわしく、不正確で不正確です。 C++では、これらのオブジェクトをどこに格納しなければならないかは指定されておらず、今日では必ずしも「スタック」または「ヒープ」であるとは限りません。正確である:自動保存期間を持つオブジェクトは、作成されたブロックが終了すると自動的に破棄されます。ダイナミックストレージ期間を持つオブジェクトはnew-expressionで作成されます。それらの存続期間は、delete式を使用して破棄されるまで続きます。 –

関連する問題