コードでは、stlとMFCの両方のコンテナを使用しています。各オブジェクトにstd :: vectorが含まれているオブジェクトのCArrayがある場合があります。std :: vector in MFC CArray - CArrayに要素を追加した後に "反復子がdereferencableでない"エラーが発生する
複数のオブジェクトをCArrayに追加すると、CArrayのデータが最大サイズに達すると再割り当てされてコピーされるため、内部ベクトルが破損しているように見えます。 CArrayを反復処理し、各オブジェクトに対してstd :: vectorを反復処理すると、 "ベクトル反復子は逆参照できません"というエラーが発生します。
私はMFCコードを見て、再割り当て後にデータをコピーするためにmemcpy()を使用します。 std :: vector(私はVisual Studioを使用しています)には、新しいベクトル(memcpy()によってコピーされたベクトル)の値を変更するように見える_Mycontというメンバを持つ_Myproxyというメンバがあります。
私はこの問題を再現しました。以下のサンプルコードを添付します。
私はこのコードをリファクタリングすることができますが、私はそうするでしょうが、何が起こっているのかを正確に理解したいと思います。
#include "stdafx.h"
#include <vector>
#include <iostream>
// an object which holds an std::vector
class test_t
{
public:
test_t() {}
~test_t()
{
std::cout << "d'tor" << std::endl;
}
void add(int i)
{
m_vec.push_back(i);
}
void print()
{
for (std::vector<int>::iterator it = m_vec.begin(); it != m_vec.end(); ++it)
{
int i = *it;
std::cout << i << std::endl;
}
std::cout << std::endl;
}
private:
std::vector<int> m_vec;
};
void test()
{
// array if objects where each object holds an std::vector
CArray<test_t, test_t&> arr;
for (int i = 0; i < 10; ++i)
{
test_t t;
int j = arr.Add(t);
test_t& rt = arr[i];
rt.add(1);
rt.add(2);
rt.add(3);
}
for (int i = 0; i < arr.GetSize(); ++i)
{
test_t& rt = arr[i];
rt.print(); // error occurs here
}
}
おかげで、 ガブリエル