C++ 标准::MFC CArray内的向量-获取;“迭代器不可取消引用”;将元素添加到CArray后出错

C++ 标准::MFC CArray内的向量-获取;“迭代器不可取消引用”;将元素添加到CArray后出错,c++,vector,stl,mfc,C++,Vector,Stl,Mfc,在我们的代码中,我们同时使用stl和MFC容器。我遇到了一个例子,其中我们有一个对象的CArray,其中每个对象都包含一个std::vector 将多个对象添加到CArray后,CArray中的数据将在达到其最大大小时重新分配和复制,看起来内部向量已损坏。当我在CArray上迭代时,对于在std::vector上迭代的每个对象,我会得到一个“vector iterator not Dereferenceable”错误 我查看了MFC代码,它使用memcpy()在重新分配后复制数据。在std::v

在我们的代码中,我们同时使用stl和MFC容器。我遇到了一个例子,其中我们有一个对象的CArray,其中每个对象都包含一个std::vector

将多个对象添加到CArray后,CArray中的数据将在达到其最大大小时重新分配和复制,看起来内部向量已损坏。当我在CArray上迭代时,对于在std::vector上迭代的每个对象,我会得到一个“vector iterator not Dereferenceable”错误

我查看了MFC代码,它使用memcpy()在重新分配后复制数据。在std::vector(我使用visual studio)中有一个名为_Myproxy的成员,该成员有一个名为_Mycont的成员,该成员似乎在新向量(由memcpy()复制的向量)中更改其值

我复制了这个问题,我附上下面的示例代码

我可以重构这段代码,我可能会这样做,但我想确切地了解发生了什么

#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
    }
}
#包括“stdafx.h”
#包括
#包括
//包含std::vector的对象
班级考试
{
公众:
测试_t(){}
~test_t()
{

std::cout
CArray
无法很好地处理非POD类型,在调整大小时依赖于
memcpy\s


请参阅此处的注释:

CArray
无法很好地处理非POD类型,在调整大小时依赖于
memcpy\s
。您可以让它工作,但一般来说,最好避免使用此用例

请参见此处的注释: