3

私はこのコードを持っています:

struct TestDataElement1
{
    unsigned int something;
};

struct TestDataElement2
{
    boost::shared_ptr<TestDataElement1> testDataElement1;
};

TestDataElement1 test1;
test1.something = 100;

TestDataElement2 test2;
test2.testDataElement1 = boost::make_shared<TestDataElement1>(test1);
cout << "TEST1: " << test2.testDataElement1 -> something << endl;
test1.something = 200;
cout << "TEST2: " << test2.testDataElement1 -> something << endl;

これを生み出すもの:

テスト1:100

TEST2:100

しかし、test2にはtest1へのポインターがあるだけなので、なぜ100、200が生成されないのか理解できません。

4

1 に答える 1

6

テンプレート関数boost::make_sharedは、期待する動作とは異なる動作をします。この線

test2.testDataElement1 = boost::make_shared<TestDataElement1>(test1);

意味的には同等です

test2.testDataElement1 = 
    boost::shared_ptr<TestDataElement1>( 
        new TestDataElement1(test1) );

したがって、それ

  1. メモリを割り当て、
  2. TestDataElement1その場所でのコピーコンストラクタを呼び出し、
  3. そのメモリにshared_ptrを作成します
  4. に割り当てtest2.testDataElement1ます。

test1したがって、コピーの値を2回だけ出力します。

ちなみに、shared_ptrカスタム削除機能を指定しない限り、スタック上にメモリへのを作成することはできません。

于 2012-08-13T16:18:57.770 に答える