使用ptr容器而不是普通容器可以得到_Block_Type_Is_Valid

时间:2014-07-25 18:07:37

标签: c++ boost

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);,因为如果删除这些行,程序就可以正常工作。

1 个答案:

答案 0 :(得分:1)

与intrusive_ptr不同,没有共享所有权 [¹]

ptr_vector获取你push_back指针的所有权。

由于没有共享所有权,因此当地图超出范围时,这会导致双倍空闲。

将副本存储到向量中,或使用共享所有权(shared_ptr)


[¹] 我认为你的第一个样本应该看起来像这样:http://coliru.stacked-crooked.com/a/cc228ec98163879e