2016-08-21 4 views
1

コードでは、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 
    } 
} 

おかげで、 ガブリエル

答えて

関連する問題