gpt4 book ai didi

c++ - 使用 ptr 容器而不是普通容器给出 _Block_Type_Is_Valid

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:25 30 4
gpt4 key购买 nike

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

最佳答案

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

ptr_vector 拥有您 push_back 到它的指针的所有权。

因为没有共享所有权,所以本地图超出范围时会导致双重释放。

要么将拷贝存储到您的 vector 中,要么使用共享所有权 (shared_ptr)


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

关于c++ - 使用 ptr 容器而不是普通容器给出 _Block_Type_Is_Valid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24961955/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com