現在、DirectX ゲームに取り組んでおり、定数バッファー コンストラクターで memset(0) (必要に応じて VS の ZeroMemory マクロ) を使用して、すべての値をゼロで初期化し、問題なく動作します。この方法でベクトルを含む他のスタクトを誤って初期化しようとしたときに問題が発生します。コンパイラ (VS2010/VS2012) によると、これにより「ベクトル イテレータに互換性がありません」、std::vector::end がより正確になります。memset がベクトル イテレータを無効にする可能性があることは理解できますが、要素をベクトルにプッシュした後、「終了」イテレータが正しく機能しないのはなぜですか。ベクトルの終了イテレータを正しい位置 (最後の要素の後) に再配置するべきではありませんか? すべての種類の std::some_container::end イテレータもこれの影響を受けますか?
#include <vector>
class MyClass
{
public:
MyClass() {
memset(this, 0, sizeof(*this));
}
~MyClass() {}
std::vector<int>& GetData() { return m_data; }
float m_range;
private:
std::vector<int> m_data;
};
int main()
{
MyClass myClass;
myClass.GetData().push_back(1);
myClass.GetData().push_back(2);
for (auto it = myClass.GetData().begin(); it != myClass.GetData().end(); it++)
{
//stuff
}
}