2010-12-04 14 views
1

現在、このC++ソースコードを調べています。私はC++の開発者ではありません。C++メソッド変数宣言

void SomeClass::SomeMethod() const 
{ 
    vector<Thing> things(count); 

    ... 
    //Elements are added or replaced in things but no deallocation of things here 
} 

SomeMethod多くの時間と呼ばれています。誰もが漏れがなく、thingsが1回だけ割り当てられていることを確認できましたが、参考になります。

+1

これは、関数呼び出しに1回割り当てられます。より多くのコードがなければ、この使用法が正しいかどうか、またはメモリの割り当てや解放に費やされるコストが低いかどうかで正解を得ることはできません。 –

答えて

5

vectorは、関数を入力するたびに作成され、スコープを終了すると(関数が終了すると)すべてのオブジェクトが破棄され(すべてのオブジェクトが破棄され、すべてのメモリが解放されます)リークはありませんが、その関数を頻繁に呼び出すと、多くの割り当てや割り当て解除が行われます。

あなたはそれを避けるために、2つのソリューションがあります(推奨)このベクトル(それがconst方法で変更することができるようにするために属性をmutable付き)クラスフィールド、

  • これを確認してください

    • をベクトル静的変数。 Thingを提供
  • +1

    +1しかし、一度メンバまたは静的を設定すると、再配置を制限する管理コードを追加する必要があります。まず、vectorのreserve()関数を使用し、次に最大サイズを取得しようとします。新しい使用前にベクターがクリアされていることを確認します。 – Klaim

    +1

    clear()は、私が見たようなすべての実装のようなメモリを解放しないので、実際は必要ありません。したがって、ベクターの負荷がすべての関数呼び出しで似ている場合、最初の呼び出しのみが高価になり、次の呼び出しはすべて再割り当てされません。ベクターには必要なメモリープールがすでに割り当てられているためです。 – Kos

    +0

    'things'のシングルトン割り当てが適切であることを知る前にもっと多くのコードを見る必要がありますか?この関数が 'const'であるという事実は、元のコーダが彼らが何をしているのかをある程度知っていることを示唆していませんか? –

    2

    が正しく正しくそのデータメンバーのすべてのメモリを扱う(つまりはvector家事に使われているので、特にコピーコンストラクタ)デストラクタと他のメンバ関数限りにおいて実施され、これが何を行いますと、それぞれに新しいvector<Thing>を作成しています関数を呼び出します。

    得られたローカル変数thingsが正しく(すなわち、関数終了時に)すべてのThing部材の破壊、変数がスコープから外れるなど、解放されます。

    メソッド内のすべてのコードとThingを参照しないと最終的に確定することは不可能ですが、この使用法は正しいです。

    1

    この機能にはlocalyがあります。それが範囲外になると、それはメモリを単独でデロケートします。すべてのSTLコンテナが行います。