我有这个代码:
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 的指针。
最佳答案
模板函数 boost::make_shared 的行为与您预期的不同。线路
test2.testDataElement1 = boost::make_shared<TestDataElement1>(test1);
在语义上等同于
test2.testDataElement1 =
boost::shared_ptr<TestDataElement1>(
new TestDataElement1(test1) );
因此
- 分配内存,
- 在该位置调用
TestDataElement1
的复制构造函数, - 为那 block 内存创建一个 shared_ptr
- 并将其分配给
test2.testDataElement1
。
所以你只输出 test1
副本的值两次。
顺便说一句,除非指定自定义删除器,否则您将永远无法为堆栈上的内存创建 shared_ptr
。
关于shared-ptr - C++ Boost make_shared 创建一个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11848791/