gab*_*iel 1 c++ mfc stl vector
在我们的代码中,我们使用stl和MFC容器.我遇到过一个我们有一个CArray对象的情况,其中每个对象都包含一个std :: vector.
在向CArray添加多个对象之后,CArray中的数据将在达到最大大小时重新分配和复制,看起来内部向量已损坏.当我遍历CArray并且每个对象遍历std :: vector时,我得到一个"vector iterator not dereferencable"错误.
我查看了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
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,加布里埃尔
CArray不适合非POD类型,依赖于memcpy_s调整大小时.你可以使它工作,但一般来说,最好避免这个用例.
请参阅此处的说明:https: //msdn.microsoft.com/en-us/library/4h2f09ct.aspx