2012-08-07 145 views
3

我有这样的代码:C++升压make_shared创建副本

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的指针。

回答

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

因此,您只输出test1副本的值两次。

顺便说一下,除非您指定自定义删除程序,否则您将永远无法创建shared_ptr到堆栈中的内存。