1

私は次のコードを持っています:

std::vector<A>& Get() { return some_object; };

for(int i=0; i<Get().size(); ++i) {
    x->push_back(Get()[i]);
}

しかし、最初にsize()を呼び出したときに、ガベージ値を取得しています。一時的なものがどこかで削除されていると思っていますが、よくわかりません...誰かが何が起こっているのか教えてもらえますか?

編集:mysome_objectは静的ベクトルなので、この例では削除されません

4

4 に答える 4

5

forループを置き換えることをお勧めします。私はループを信用していません。虫が忍び寄る場所が多すぎます。

std::vector<A>& v = Get();
x.insert(x.end(), v.begin(), v.end());
于 2012-08-02T16:54:08.237 に答える
3

可能性は2つだけです。参照が悪いか、オブジェクト自体が悪いです。

参照は静的ベクトルに対するものであるため、参照が不良である可能性は低いようです。静的オブジェクトは消えません。

それはオブジェクト自体を残します。静的オブジェクトが初期化される前に関数が呼び出されている可能性はありますか?これは、別の静的オブジェクトのコンストラクターから呼び出された場合に発生する可能性があります。

于 2012-08-02T16:35:19.827 に答える
2

forループがグローバルまたは静的オブジェクトのコンストラクターのコンテキスト内から実行されている場合、静的初期化順序の大失敗(SIOF)と呼ばれる問題が発生します。一言で言えば、SIOFは、静的オブジェクトが構築される順序に依存できないことを意味します。

この問題を回避するには、最初の使用イディオムで構成を使用できます。このイディオムを使用すると、静的/グローバルオブジェクトを最初に必要になったときに怠惰に構築できます。これにより、相互に依存する静的オブジェクトがアクセス時に作成されます。

あなたの例では、次のようなことを行うことができます。

std::vector<A>& Get()
{
    // 'instance' will be constructed "on demand" the first time this
    // function is called.
    static std::vector<A> instance;
    return instance;
};

このトリックは、シングルトンデザインパターンを実装するためにも使用されます。

注:プログラムがマルチスレッドの場合は、このトリックの変形を使用する必要があります。

于 2012-08-02T16:44:34.757 に答える
1

some_objectライフタイムがの本体に制限されている場合にのみ正しくありませんGet

于 2012-08-02T16:23:10.240 に答える