1

= 演算子を使用して新しいポインターを割り当てた場合、以前のポインターは std::shared_ptr で自動的に破棄 (または逆参照) されますか?

例えば:

std::shared_ptr< Type > sp1 (ptr1, std::ptr_fun(destroy));
std::shared_ptr< Type > sp2 (ptr2);

sp1 = sp2; // now, will ptr1 be dereferenced and / or destroyed?
// and will the destroy() function get called?
4

2 に答える 2

4

はい、さもないとリークが発生し、スマートptrを持つという目的が損なわれます。

簡単なテストを行ったところ、リークは発生しませんでした

#define BOOST_TEST_MODULE leakTest
#include <boost/test/unit_test.hpp>


BOOST_AUTO_TEST_CASE( Leak_Test )
{
    std::shared_ptr< int > sp1 (new int(3));
    std::shared_ptr< int > sp2 (new int(4));

    sp1 = sp2;
}

結果:

1つのテストケースを実行しています...

*エラーは検出されません続行するには任意のキーを押してください。

。。

于 2012-07-30T04:06:57.487 に答える
2

はい、そうです。shared_ptr は、元のポインターを実際に保持する内部オブジェクトを持つデータ構造です。この内部オブジェクトには、shared_ptr をコピーするたびに増加するカウンターがあり、shared_ptr が破棄されるか、別の shared_ptr が割り当てられると減少します。カウントがゼロになるとすぐに、内部オブジェクトは元のポインターと一緒に破棄されます。

あなたの場合:

std::shared_ptr< Type > sp1 (ptr1, std::ptr_fun(destroy)); //the counter of sp1 is 1
std::shared_ptr< Type > sp2 (ptr2); //the counter of sp2 is 1
sp1 = sp2; //the counter of sp1 is 0, the counter of sp2 is 2

したがって、ptr1 は破棄され、sp1 と sp2 は同じポインター ptr2 を共有します。

于 2012-07-30T04:23:50.933 に答える