c++ - C++ std::shared_ptr,是否重载 operator= 以使用复制构造函数?
问题描述
如果我执行以下操作:
class Foo
{
std::shared_ptr<Bar> bar;
Foo(std::shared_ptr<Bar> bar)
{
this->bar = bar;
}
}
std::shared_ptr<Foo> func()
{
std::shared_ptr<Bar> bar_ptr(new Bar());
std::shared_ptr<Foo> foo_ptr(new Foo(bar_ptr));
return foo_ptr;
}
foo_ptr
在其成员变量 bar中func()
有一个有效的指针吗?似乎只有在设置this->bar = bar
构造函数参数被复制时才会这样做。是否总是重写= 运算符std::shared_ptr
以调用复制构造函数?
解决方案
复制构造函数和赋值运算符都将使接收者与您传入的接收者共享所有权。但是,它们在内部执行该操作是一个实现细节。
当然,如果this->bar
正在管理某个东西,那么它将释放它对它的共享所有权(如果它是最后一个拥有它的人,那么那里的任何东西Bar
都会被删除)。
但是我在这里担心的是,Foo的构造函数中的this-> bar和bar都是相同的引用,这意味着内存中实际上只有一个shared_ptr对象,但我有2个变量引用了那个shared_ptr。
它们不是引用,bar
并且this->bar
是两个不同std::shared_ptr
的对象,在分配之后,它们将(内部)指向内存中的同一位置(但它们仍然是两个不同的对象)。但是,std::shared_ptr
是一个知道有多少其他std::shared_ptr
s 指向它的类(共享所有权),并且只有在所有其他对象都消失后才会正确删除该对象(因此只有最后一个std::shared_ptr
会销毁它)。
推荐阅读
- flutter - Flutter 关闭应用时如何保存数据
- php - 在 Codeigniter 的 Rest API 中使用 JWT 令牌的最佳方式。登录和注册的表架构应该是什么?如果我将令牌存储在表中
- ansible - Ansible:使用 with_items 模块时如何跳过一些空项目?
- javascript - 在调用 router.push() 之前加载 Vue 组件
- mongodb - mongodb函数返回格式
- javascript - 如何在本机反应中使用后退按钮重新渲染组件?
- react-native - ios13是强制登录的吗?
- image-segmentation - 医学图像分割:python 中 3D 图像的最大表面距离?
- angular - 使用什么符号技术来描述 Angular 语法?
- vb.net - 如何使checkboxlist多列