引用 shared_pointer 的引用计数
Reference count for a reference to shared_pointer
我了解到 shared_ptr
class 自动管理动态对象。
在这里,我有一个函数 f
,它 return 是一个 const shared_ptr<int>
到一个 int 2
。
我有两个版本的 main
,只有一处不同。版本 A 将 f
的 return 值保存到 共享指针 中,而版本 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
是指向 int
的最后一个 shared_ptr
,因此 use_count
是 1
。
问题:为什么版本 B 的 use_count
等于 1
?最后一个 shared_ptr
在哪里?
在 C++ 中,如果您将临时对象直接分配给 &&
或 const&
,引用生命周期延长就会生效,并且临时对象的持续时间与引用一样长。
这仅在您的引用是局部变量时有效1。
1 或者在某些情况下,在某些编译器中,您使用 struct
s 的聚合构造。但是不要使用它,因为它是 "transparent" 转发构造函数的行为与聚合根本不同的地方之一,因此以后无害的更改可能会破坏您的代码。
我了解到 shared_ptr
class 自动管理动态对象。
在这里,我有一个函数 f
,它 return 是一个 const shared_ptr<int>
到一个 int 2
。
我有两个版本的 main
,只有一处不同。版本 A 将 f
的 return 值保存到 共享指针 中,而版本 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
是指向 int
的最后一个 shared_ptr
,因此 use_count
是 1
。
问题:为什么版本 B 的 use_count
等于 1
?最后一个 shared_ptr
在哪里?
在 C++ 中,如果您将临时对象直接分配给 &&
或 const&
,引用生命周期延长就会生效,并且临时对象的持续时间与引用一样长。
这仅在您的引用是局部变量时有效1。
1 或者在某些情况下,在某些编译器中,您使用 struct
s 的聚合构造。但是不要使用它,因为它是 "transparent" 转发构造函数的行为与聚合根本不同的地方之一,因此以后无害的更改可能会破坏您的代码。