私はオブジェクトへの共有のポインタを返す関数(あるため、多くの大規模な依存関係のMyObjectに定義を含めることは困難である)している:C++:エラーからコピーするとき*のstd :: shared_ptrの
std::shared_ptr<MyObject> f(std::string params)
{
return std::shared_ptr<MyObject>(new MyObject(params));
}
ん
ケース1:このコードCRAながらvalgrind -v --tool=memcheck
std::shared_ptr<MyObject> obj_ptr = f("hello");
MyObject obj = *obj_ptr;
でエラーなしに、このコードが動作する理由を誰もが知っていますシーズ:
ケース2:クラッシュとはvalgrind -v --tool=memcheck
MyObject obj = *f("hello");
MyObjectにクラスが作業代入演算子を持っており、(両方がケース1で検証)コンストラクタをコピーして、いくつかのエラーが発生します。
std::shared_ptr<MyObject>
(f
経由)の作成、ポインタへのコピー、スタック上のオブジェクトへのポインタのコピー、およびポインタの削除を試みました。スタック上の最終的なオブジェクトは、罰金はまだです:
ケース3:valgrind -v --tool=memcheck
std::shared_ptr<MyObject> obj_ptr = f("hello");
MyObject * obj_ptr2 = new MyObject(*obj_ptr);
MyObject obj3 = *obj_ptr2;
delete obj_ptr2;
obj3.print();
とエラーがstd::shared_ptr
が右辺値として作成されるかもしれないので、エラーではありませんし、できるだけ早くそのメモリを解放します*
演算子は実行されますか?
何コンパイラのどのバージョンを使用していますか? – ildjarn
クラッシュしたときのエラーは何ですか?スタックトレースが役立つかもしれません... –
MyObjectコピーコンストラクタはディープコピーをしていますか? (ケース1は、浅いコピーでは正常に動作します)。 – bobah