2016-10-04 109 views
0

我知道shared_ptr类会自动管理动态对象。引用到shared_pointer的引用计数

在这里,我有一个功能f返回const shared_ptr<int>int 2

我有两个版本main在一个地方不同。版本A将返回值f保存为共享指针,而版本B保存为共享指针参考

using namespace std; 
    const std::shared_ptr<int> f() { 
     const std::shared_ptr<int> ret = std::make_shared<int>(2); 
     return ret; 
    } 

    int main() { 
     const std::shared_ptr<int> p = f();  // A 
     // const std::shared_ptr<int> &p = f(); // B 
     cout << p.use_count() << *p << endl; // prints 1 2 
     return 0; 
    } 

两个版本打印1 2。我对版本A没问题,因为p是最后的shared_ptr指向int,因此use_count1

问题:为什么use_count等于1版本B?最后现有的shared_ptr在哪里?

+1

“std :: shared_ptr”的引用计数适用于实例,而不适用于引用。 –

+0

@πάνταῥεῖ谢谢。对于版本A,是否是实例'p'?对于版本B,这是现有的实例?它是'f()'的返回值吗?也许我没有完全理解引用,我认为引用是对象的别名。 – sam

+3

临时生存期与const引用一起出现。 – Jarod42

回答

1

在C++中,如果您直接为&&const&指定一个临时值,那么只要引用有效,引用生存期扩展就会启动并暂时停止。

这只适用于当您的参考是本地变量。


或者在在您使用的struct s的总建筑一定的编译器的某些情况。但不要使用它,因为它是“透明”转发构造函数与汇总行为基本上不同的地方之一,所以稍后无害的更改可能会破坏您的代码。