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

时间:2014-07-21 07:15:49

标签: c++ boost

这是我测试的代码:uncomment //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中删除它时会崩溃,反之亦然。

1 个答案:

答案 0 :(得分:1)

这不是导致崩溃的元素的实际擦除,而是你没有擦除元素超出范围的另一个容器。

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

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

list1.erase(itrDelete);

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

如果要在两个向量之间共享相同的动态分配对象,则应使用

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

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