如果我执行以下操作:
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
在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
对象指向它(共享所有权),并且仅在所有其他对象都消失之后才正确删除该对象(因此只有最后一个对象std::shared_ptr
会销毁它)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句