我有这段代码:
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的指针。
答案 0 :(得分:5)
模板函数boost :: make_shared的行为与您期望的不同。这条线
test2.testDataElement1 = boost::make_shared<TestDataElement1>(test1);
在语义上等同于
test2.testDataElement1 =
boost::shared_ptr<TestDataElement1>(
new TestDataElement1(test1) );
因此它
TestDataElement1
的复制构造函数test2.testDataElement1
。因此,您只输出test1
副本的值两次。
顺便说一句,除非指定自定义删除器,否则您永远无法在堆栈上创建shared_ptr
内存。