我有boost shared_ptr的向量,但是,当我推送到本地创建的新shared_ptr的末尾时,它会失败。有人可以告诉我下面的代码有什么问题吗?
std::vector<boost::shared_ptr< A > > vecA;
BOOST_FOREACH(const std::string& s, vecStrings)
{
boost::shared_ptr<A> pNewA = boost::make_shared<A>(s);
pNewA->MyString(); //OK
vecA.push_back(pNewA); //throw error Assertion `px != 0' failed
}
更新: 这似乎不是推送的问题,但我使用了对shared_ptr的引用。
for(int i=0, n=vecA.size(); i <n; i++)
{
//use pA
boost::shared_ptr& pA = vecA[i];
vecA.push_back(pA);
//will core dump at the end of loop because pA changed due to vector enlarge
}
答案 0 :(得分:-3)
不确定为什么你在那里使用boost库(不太熟悉它们)但共享指针也在标准的lib内存中
#include <memory>
最有可能的是共享指针对象的所有权问题。如果使用标准库编写,正确的代码将如下所示:
#include <vector>
#include <memory>
//...
std::vector<std::shared_pointer<A> > vecA;
//version 1
std::shared_ptr<A> pNewA = std::make_shared<A>(s);
pNewA->MyString();
vecA.push_back(std::move(pNewA)); //std::move moves ownership to vector
//or alternativeley
vecA.push_back(std::shared_pointer<A>(new class A(s)));
或沿着这些方向的东西..
HTH