std::矢量在 MFC CArray 中 - 在将元素添加到 CArray 后出现"iterator not dereferencable"错误

std::vector inside MFC CArray - getting "iterator not dereferencable" error after adding elements to the CArray

本文关键字:CArray not 错误 dereferencable iterator 元素 MFC std 添加      更新时间:2023-10-16

在我们的代码中,我们使用了stl和MFC容器。我遇到过这样一种情况:我们有一个对象数组,其中每个对象都包含一个std::vector。

在向CArray中添加多个对象后,使得CArray中的数据在达到最大大小时将被重新分配和复制,看起来内部向量被损坏了。当我遍历数组,并对每个对象遍历std::vector时,我得到了一个"vector迭代器不可解引用"的错误。

我看了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
    }
}

谢谢,加布里埃尔

CArray不适合非pod类型,在调整大小时依赖memcpy_s。您可以使其工作,但通常在此用例中最好避免使用。

请看这里的注释:https://msdn.microsoft.com/en-us/library/4h2f09ct.aspx