オブジェクトへの共有ポインターを返す関数があります (多くの大きな依存関係があるため、MyObject 定義を含めるのは困難です)。
std::shared_ptr<MyObject> f(std::string params)
{
return std::shared_ptr<MyObject>(new MyObject(params));
}
このコードが機能する理由を知っている人はいますか:
ケース 1: エラーなし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 クラスには、動作する代入演算子とコピー コンストラクターがあります (どちらもCase 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
されるとすぐにメモリを解放するためですか?*