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;
        // ...
}

AClassvector に の新しいオブジェクトを追加したいm_Objects
動的メモリ割り当てを行わずにこれを行う他の方法はありますか?

4

4 に答える 4

4

ここでは、動的メモリ割り当てを引き起こす 2 つの原因があります。

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

動的メモリ割り当てを減らす方法の 1 つを次に示します。

m_Objects.reserve(N);最初のステップは、AnotherClassコンストラクターを呼び出すことです。ここで、 は任意の時点で保持するオブジェクトNの最大数です。AClassこれにより、 による動的割り当ての必要性をなくすのに十分なメモリが確保されvector::push_backます。

2 番目のステップはm_Objects、ポインターの代わりにオブジェクトを含むようにすることです。つまり、 のstd::vector<AClass>代わりに型を作成しstd::vector<AClass*>ます。これにより、コンテナを成長させることで、スキップnewして新しいオブジェクトを直接作成できます。

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

これで、新しいオブジェクトを追加するときに動的割り当てがなくなります。

于 2011-01-06T23:17:02.617 に答える
2

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

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

于 2011-01-06T23:06:27.660 に答える
1

自動 (スタック) 変数へのポインターを格納する場合を除き、ポインターm_Objectsの aほど長くはありません。しかし、それは間違いなく非常に悪い考えです。vector

于 2011-01-06T23:07:33.120 に答える
1

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

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

つまり、他の唯一の方法は、 を使用newして新しいオブジェクトを動的に作成することです。

于 2011-01-06T23:15:13.420 に答える