c++ - 添加一个指向多个 boost::ptr_vector 列表的指针时崩溃

标签 c++ boost

这是我正在测试的代码:取消注释//list2.push_back(test);会崩溃,什么问题?谢谢 //尝试列表

boost::ptr_vector<char> list1;
boost::ptr_vector<char> list2;

char* test = new char[512];

strcpy(test,"what");

list1.push_back(test);
//list2.push_back(test);

boost::ptr_vector<char>::iterator itr;
boost::ptr_vector<char>::iterator itrDelete;

for(itr = list1.begin();itr!=list1.end();++itr)
{
    if(strcmp("what",&(*itr)) == 0 ) {
        itrDelete = itr;
    }
}
list1.erase(itrDelete);

在这种情况下,list2 是 list1 的一小部分,我一直跟踪它以供其他使用,但是当我从 list1 中删除时,它崩溃了,反之亦然。

最佳答案

导致崩溃的不是元素的实际删除,而是您尚未从中删除元素的其他容器超出范围。

全部Boost Pointer Containers期望您添加到它们的对象是动态分配的,并且当您从容器中删除对象时将调用对象上的 delete

在您的示例中,您已将相同的动态分配对象添加到两个容器中,因此两个容器都期望拥有该 char 数组的所有权。当你打电话时

list1.erase(itrDelete);

list1删除 char 数组。稍后,当 list2 超出范围时,它也会尝试删除 您添加到其中的所有元素,这会导致 char< 的双重删除 test 指向的数组,这是未定义的行为。

如果你想在两个 vector 之间共享同一个动态分配的对象,你应该使用

boost::ptr_vector<char> list1;
std::vector<char *> list2;

现在,list1 拥有您添加到两者的动态分配的 char 数组的所有权,list2 将简单地用作相同的访问器数组。

关于c++ - 添加一个指向多个 boost::ptr_vector 列表的指针时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24859525/

相关文章:

c++ - std::atomic_flag 静态初始化线程在 Visual Studio 2012 中是否安全?

c++ - 为什么在模板推导过程中没有选择正确的功能

c++ - 在 C++ 中乘以两个 float 给我非数字结果

c++ - boost 拆分编译问题

c++ - Visual Studio 2013 中的 Boost Spirit kwd 解析器

c++ - 在 Windows XP/Server 2003 下将新旧本地时间转换为 UTC

c++ - qt 等待信号/事件,GUI

c++ - 包装类常量正确性问题

c++ - 使用后如何使用boost program_options在ARGV中使用/删​​除选项

c++ - Mpl for_each 与 mpl 列表