2012-02-19 18 views
1

私は次の問題を解決するために頭を下げようとしています。私はオブジェクトへのconst参照を受け入れる次の関数を持っています。私がやりたいことは、ストレージを与えることです、オブジェクトコンポーネントへのポインタが参照しています。しかし、storage.push_back()を呼び出すと、オブジェクトコンポーネントが参照されている(メンバーデータが破損する)ポインタを使ったC++のベクトルpush_back

私は、同じオブジェクトコンポーネントへのポインタを参照しようとしていますが、 。

void InputSystem::RegisterInputAcceptingEntity(const PlayerInputComponent &component) { 

    auto *cpy = &component; 

    std::vector<const PlayerInputComponent*> storage; 
    storage.push_back(cpy); 
} 

なぜ、上記のコードはすべてオブジェクトコンポーネントが参照している変更するのですか?

編集:私は定数ポインタを含むようにベクトルを編集しました。

正確に何が起こっているかを示すスクリーンショットです。ここで呼び出される側で、参照渡しの引数を調べると、input_componentメンバーが壊れていないことがわかります。 enter image description here 画像へのURL:http://i.imgur.com/lKpRm.png

は、しかし、第二の画像では、ちょうど上記の言った方法にステップインした後:画像へ

enter image description here URL:http://i.imgur.com/x0Vdn.png

私は印象の下にしてきましたconst参照を渡すと、オブジェクトが関数の内部/外部で異なる方法はありません。 const参照が渡された場合、なぜオブジェクトがまったく変更されないのか分かりません。

+4

データ破損の問題は、呼び出し元の可能性が最も高いです。しかし、このコードは 'const_cast'を悪用します。なぜ引数は 'const'ですか? –

+0

あなたは 'Vector 'を持っているか、そうでなければconstnessの要件を考え直すべきでしょう。また、 '&'の上に 'std :: addressof(component)'を置いてください。 –

+0

破損は、私が知る限り、push_back()の時点(vs2011ベータのデバッグツール)で発生します。オブジェクトは、関数が参照していたオブジェクトコンポーネントを変更するのを防ぐためにconstにされました。 – Short

答えて

1

まず、コードをvalgrindに実行して、破損が実際に発生している場所を確認します。配列にポインタを押しても、指し示されているデータに対して何もしてはいけません。

関連する問題