2016-06-29 57 views
0

我有boost的shared_ptr向量,但是,當我推到本地產生的新的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 
} 

UPDATE: 好像推的不是這個問題,但我用了一個參考到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 
} 
+2

什麼是'A'?什麼是'pNewA-> MyString()'? – erenon

+0

我懷疑[未定義行爲](https://en.wikipedia.org/wiki/Undefined_behavior)。嘗試用較小的樣本重現您的問題。逐漸消除錯誤的來源,直到消失。 – sehe

+0

A只是一個帶有字符串成員和兩個整數成員的結構。 –

回答

-3

不知道爲什麼你使用升壓圖書館的存在(不是太熟悉他們),但共享指針也都在標準庫內存

#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

+0

'std :: shared_ptr'有一個拷貝構造函數,所以'std :: move()'在將'std :: shared_ptr'推入容器時不需要。另一方面,如果你使用'std :: unique_ptr',那麼你需要'std :: move()',因爲'std :: unique_ptr'沒有拷貝構造函數,但是有一個移動構造函數。無論哪種方式,如果你真的想推新對象,可以考慮使用'emplace_back()'而不是'push_back()'。 –

+0

沒有查看C++ 14,所以emplace_back()對我來說是新的。謝謝! – jaaq

+0

''emplace_back()'是在C++ 11中添加的,與'std :: shared_ptr'和'std :: make_shared()'相同。 –