私は次の問題を解決するために頭を下げようとしています。私はオブジェクトへの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メンバーが壊れていないことがわかります。 画像へのURL:http://i.imgur.com/lKpRm.png
は、しかし、第二の画像では、ちょうど上記の言った方法にステップインした後:画像へ
URL:http://i.imgur.com/x0Vdn.png
私は印象の下にしてきましたconst参照を渡すと、オブジェクトが関数の内部/外部で異なる方法はありません。 const参照が渡された場合、なぜオブジェクトがまったく変更されないのか分かりません。
データ破損の問題は、呼び出し元の可能性が最も高いです。しかし、このコードは 'const_cast'を悪用します。なぜ引数は 'const'ですか? –
あなたは 'Vector'を持っているか、そうでなければconstnessの要件を考え直すべきでしょう。また、 '&'の上に 'std :: addressof(component)'を置いてください。 –
破損は、私が知る限り、push_back()の時点(vs2011ベータのデバッグツール)で発生します。オブジェクトは、関数が参照していたオブジェクトコンポーネントを変更するのを防ぐためにconstにされました。 – Short