gpt4 book ai didi

c++ - MFC CArray 中的 std::vector - 将元素添加到 CArray 后出现 "iterator not dereferencable"错误

转载 作者:行者123 更新时间:2023-11-30 00:46:19 25 4
gpt4 key购买 nike

在我们的代码中,我们同时使用了 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

关于c++ - MFC CArray 中的 std::vector - 将元素添加到 CArray 后出现 "iterator not dereferencable"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39065722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com