这是我测试的代码: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中删除它时会崩溃,反之亦然。
答案 0 :(得分:1)
这不是导致崩溃的元素的实际擦除,而是你没有擦除元素超出范围的另一个容器。
所有Boost Pointer Containers期望您添加到它们的对象被动态分配,并且当您从容器中删除它时将在对象上调用delete
。
在您的示例中,您已向两个容器添加了相同的动态分配对象,因此两者都希望拥有该char
数组的所有权。当你打电话
list1.erase(itrDelete);
list1
将delete
char
数组。稍后,当list2
超出范围时,它也将尝试delete
您添加到其中的所有元素,这会导致char
数组的双重删除test
数组1}},这是未定义的行为。
如果要在两个向量之间共享相同的动态分配对象,则应使用
boost::ptr_vector<char> list1;
std::vector<char *> list2;
现在,list1
拥有您添加到两者的动态分配的char
数组的所有权,list2
将仅用作同一数组的访问者。