2012-02-16 7 views
7

ローカル変数で満たされたベクトルを返すのは安全ですか?例えばローカル変数を含むベクトルを返すのは安全ですか?

は、私が持っている場合は...この例では

#include <vector> 

struct Target 
{ 
public: 
    int Var1; 
    // ... snip ... 
    int Var20; 
}; 


class Test 
{ 
public: 
    std::vector<Target> *Run(void) 
    { 
     std::vector<Target> *targets = new std::vector<Target>; 
     for(int i=0; i<5; i++) { 
      Target t = Target(); 
      t.Var1 = i; 
      // ... snip ... 
      t.Var20 = i*2; // Or some other number. 
      targets->push_back(t); 
     } 
     return targets; 
    } 


}; 

int main() 
{ 
    Test t = Test(); 
    std::vector<Target> *container = t.Run(); 

    // Do stuff with `container` 
} 

は、私は、ベクターにそれらをプッシュし、それへのポインタを返す、forループ内で複数Targetのインスタンスを作成しています。 Targetインスタンスはスタックにローカルに割り当てられているため、スタック上のオブジェクト(間もなく上書きされるなど)を参照しているため、返されたベクトルが安全でないことを意味しますか?もしそうなら、ベクトルを返すための推奨される方法は何ですか?

私はこれをC++で書いています。

+0

[C++でのベクトルの動的メモリ割り当て]の複製が可能です(http://stackoverflow.com/questions/9252523/dynamic-memory-allocation-of-vectors-in-c) –

答えて

14

push_backに要素をコピーすると、要素がベクターにコピーされます(または要素に割り当てられます)。あなたのコードは安全です - ベクトルの要素はローカル変数への参照ではなく、ベクトルによって所有されています。

さらに、ポインタを返す必要もなく(決して生ポインタを処理し、スマートポインタを使用する)。代わりにコピーを返すだけです。コンパイラはこれを最適化するほどスマートで、実際の冗長コピーは作成されません。

+2

私は決して扱いません生のポインタ - すべての場所があります。しかし、新しいC++ 11標準および移動コンストラクタのおかげで、コピーを生み出さない価値のある戻り値が公式になりました。 – Carl

+2

@carleeto:(N)RVOで長年にわたって公式になってきました。 – ildjarn

+0

GCC 3.1のRVOからポインタを返すのを止めました:)しかし、* "生ポインタは決して処理しません" *?私はこの1つにcarleetoと一緒に行くとあなたに同意しない、彼らは彼らの用途があります。しかし、ちょっと、とにかく+1。 – netcoder

関連する問題