C ++ Boost make_shared创建一个副本

时间:2012-08-07 15:02:57

标签: shared-ptr

我有这段代码:

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;

产生这个:

TEST1:100

TEST2:100

但我无法理解为什么它不会产生100,200,因为test2只有一个指向test1的指针。

1 个答案:

答案 0 :(得分:5)

模板函数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
  5. 因此,您只输出test1副本的值两次。

    顺便说一句,除非指定自定义删除器,否则您永远无法在堆栈上创建shared_ptr内存。