class A {
public:
void doSomething() {}
}
boost::unordered_map<int, boost::intrusive_ptr<A>> m;
m.insert(0, new A());
m.insert(1, new A());
m.insert(2, new A());
// later...
std::vector<boost::intrusive_ptr<A>> f;
boost::unordered_map<int, boost::intrusive_ptr<A>>::iterator i;
i = m.find(0);
f.push_back(i->second);
i = m.find(1);
f.push_back(i->second);
i = m.find(2);
f.push_back(i->second);
// and then do operations on f:
for(size_t i = 0; i < f.size(); ++i) {
f[i].doSomething();
}
要:
class A {
public:
void doSomething() {}
}
boost::ptr_unordered_map<int, A> m;
m.insert(0, new A());
m.insert(1, new A());
m.insert(2, new A());
// later...
boost::ptr_vector<A> f;
boost::ptr_unordered_map<int, A>::iterator i;
i = m.find(0);
f.push_back(i->second);
i = m.find(1);
f.push_back(i->second);
i = m.find(2);
f.push_back(i->second);
// and then do operations on f:
for(size_t i = 0; i < f.size(); ++i) {
f[i].doSomething();
}
我使用ptr容器而不是普通容器,并且出现_Block_Type_Is_Valid (pHead->nBlockUse)
错误。
使用普通的容器版本,它工作正常。
问题出在f.push_back(i->second);
,因为如果删除这些行,程序就可以正常工作。
答案 0 :(得分:1)
与intrusive_ptr不同,没有共享所有权 [¹]
ptr_vector获取你push_back指针的所有权。
由于没有共享所有权,因此当地图超出范围时,这会导致双倍空闲。
将副本存储到向量中,或使用共享所有权(shared_ptr)
[¹] 我认为你的第一个样本应该看起来像这样:http://coliru.stacked-crooked.com/a/cc228ec98163879e