在我们的代码中,我们同时使用STL和MFC容器。我遇到一种情况,我们有一个CArray对象,其中每个对象都包含一个std::vector。
在将几个对象添加到CArray之后,CArray中的数据达到最大大小后将被重新分配和复制,似乎内部 vector 已损坏。当我遍历CArray并为每个对象遍历std::vector时,出现“ vector 迭代器不可解除引用”错误。
我看了一下MFC代码,它使用memcpy()在重新分配后复制数据。在std::vector(我使用Visual Studio)中,有一个名为_Myproxy的成员,该成员有一个名为_Mycont的成员,该成员似乎在新 vector (由memcpy()复制的 vector )中改变了它的值。
我复制了这个问题,下面附上示例代码。
我可以重构此代码,并且可能会这样做,但是我想确切地了解正在发生的事情。
#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
}
}
谢谢,
加布里埃尔
最佳答案
CArray
不适用于非POD类型,在调整大小时依赖memcpy_s
。您可以使其工作,但通常在这种情况下最好避免使用它。
请参阅此处的注释:https://msdn.microsoft.com/en-us/library/4h2f09ct.aspx