C++ Boost make_shared创建一个副本

Run*_*une 3 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;
Run Code Online (Sandbox Code Playgroud)

哪个产生这个:

TEST1:100

TEST2:100

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

Ral*_*zky 6

模板函数boost :: make_shared的行为与您期望的不同.这条线

test2.testDataElement1 = boost::make_shared<TestDataElement1>(test1);
Run Code Online (Sandbox Code Playgroud)

在语义上等同于

test2.testDataElement1 = 
    boost::shared_ptr<TestDataElement1>( 
        new TestDataElement1(test1) );
Run Code Online (Sandbox Code Playgroud)

因此它

  1. 分配内存,
  2. 调用该位置的复制构造函数TestDataElement1,
  3. 为该段内存创建一个shared_ptr
  4. 并分配给test2.testDataElement1.

所以你只输出test1两次副本的值.

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