Shared_ptr压入vector失败.处理步骤

shared_ptr failed to be pushed to vector

本文关键字:处理 失败 vector ptr 压入 Shared      更新时间:2023-10-16

我有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
}

更新:这似乎不是push的问题,但我使用了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
}

不知道为什么要使用boost库(不太熟悉它们),但是共享指针也在标准库内存中

#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