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

测试2:100

但我不明白为什么它不产生 100、200,因为 test2 只是有一个指向 test1 的指针。

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两次副本的值。

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

于 2012-08-13T16:18:57.770 回答