这是我正在测试的代码:取消注释//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/