2016-06-29 5 views
0

私はboost_create_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

私は[Undefined Behavior](https://en.wikipedia.org/wiki/Undefined_behavior)の疑いがあります。小さなサンプルで問題を再現してみてください。消えてしまうまで徐々にエラーの原因を取り除く。 – sehe

+0

Aは、文字列メンバーと2つの整数メンバーを持つ単なる構造体です。 –

答えて

-3

ないあなたがそこにブーストlibrarys(彼らとあまり慣れていない)を使用しますが、共有ポインタが標準のlibメモリにも

#include <memory> 

可能性が最も高い理由、それはの所有権に問題があることを確認共有ポインタオブジェクト標準LIBSと書かれている場合、正しいコードは次のようになります。これらの線に沿って

#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 :: shared_ptr'をコンテナにプッシュするときには 'std :: move()'は必要ありません。一方、 'std :: unique_ptr'を代わりに使用していた場合、' std :: unique_ptr'はコピーコンストラクタを持たないので移動コンストラクタを持っているので 'std :: move()'が必要です。いずれにしても、本当に新しいオブジェクトをプッシュしたい場合は、 'push_back()'の代わりに 'emplace_back()'を使うことを検討してください。 –

+0

はまだC++ 14を見ていないので、emplace_back()は私にとっては新しいものです。ありがとう! – jaaq

+0

'std :: shared_ptr'と' std :: make_shared() 'と同じ' emplace_back() 'がC++ 11で追加されました。 –

関連する問題