C++ C++;std::shared_ptr,运算符是否重载以使用复制构造函数?
如果我这样做:C++ C++;std::shared_ptr,运算符是否重载以使用复制构造函数?,c++,memory,shared-ptr,C++,Memory,Shared Ptr,如果我这样做: class Foo { std::shared_ptr<Bar> bar; Foo(std::shared_ptr<Bar> bar) { this->bar = bar; } } class-Foo { std::共享的ptr条; Foo(标准::共享线程条) { 这个->条=条; } } std::shared_ptr func() { std::shared_ptr bar_ptr(new b
class Foo
{
std::shared_ptr<Bar> bar;
Foo(std::shared_ptr<Bar> bar)
{
this->bar = bar;
}
}
class-Foo
{
std::共享的ptr条;
Foo(标准::共享线程条)
{
这个->条=条;
}
}
std::shared_ptr func()
{
std::shared_ptr bar_ptr(new bar());
std::共享foo_ptr(新foo(bar_ptr));
返回foo_ptr;
}
func()
中的foo_ptr
在其成员变量栏中是否有有效指针?似乎只有在设置this->bar=bar
时才会复制构造函数参数。std::shared\u ptr
的=运算符是否被重写以始终调用复制构造函数?复制构造函数和赋值运算符都将使接收方与您传入的接收方共享所有权。然而,它们在内部执行这是一个实现细节
当然,如果this->bar
正在管理某个东西,那么它将释放它对该东西的共享所有权(如果它是最后一个拥有它的人,那么任何bar
所在的东西都将被删除)
但我在这里担心的是,Foo构造函数中的this->bar和bar都是相同的引用,这意味着内存中实际上只有一个共享的\u ptr对象,但我有两个变量引用该共享的\u ptr
它们不是引用,
bar
和this->bar
是两个不同的std::shared_ptr
对象,在赋值后,它们将(内部)指向内存中的同一位置(但它们仍然是两个不同的对象)。但是,std::shared_ptr
是一个类,它知道有多少其他的std::shared_ptr
s指向它(共享所有权),并且只有在所有其他对象都消失后才会正确删除该对象(因此只有最后一个std::shared_ptr
才会销毁它).复制构造函数和赋值运算符都将使接收者与您传入的接收者共享所有权。然而,它们在内部执行这是一个实现细节
当然,如果this->bar
正在管理某个东西,那么它将释放它对该东西的共享所有权(如果它是最后一个拥有它的人,那么任何bar
所在的东西都将被删除)
但我在这里担心的是,Foo构造函数中的this->bar和bar都是相同的引用,这意味着内存中实际上只有一个共享的\u ptr对象,但我有两个变量引用该共享的\u ptr
它们不是引用,
bar
和this->bar
是两个不同的std::shared_ptr
对象,在赋值后,它们将(内部)指向内存中的同一位置(但它们仍然是两个不同的对象)。但是,std::shared_ptr
是一个类,它知道有多少其他的std::shared_ptr
s指向它(共享所有权),并且只有在所有其他对象都消失后才会正确删除该对象(因此只有最后一个std::shared_ptr
才会销毁它).此处此->栏
对栏
管理的任何内容都有强烈的引用:
Foo(std::shared_ptr<Bar> bar)
{
this->bar = bar;
}
Foo(std::shared\u ptr bar)
{
这个->条=条;
}
这里没有复制,您只是通过将bar
分配给成员来增加shared\u ptr
的引用计数
是的,您作为成员拥有的指针是有效的,因为生存期由
共享\u ptr
管理 此处this->bar
强烈引用bar
管理的内容:
Foo(std::shared_ptr<Bar> bar)
{
this->bar = bar;
}
Foo(std::shared\u ptr bar)
{
这个->条=条;
}
这里没有复制,您只是通过将bar
分配给成员来增加shared\u ptr
的引用计数
是的,您作为成员拥有的指针是有效的,因为生存期由
共享\u ptr
管理 您正在复制指针,而不是它指向的对象。我假设共享\u ptr的复制构造函数没有复制指针指向的对象。但我在这里担心的是,Foo构造函数中的this->bar
和bar
都是相同的引用,这意味着内存中实际上只有一个共享的\u ptr对象,但我有两个变量引用该共享的\u ptr。@AlexMussell您的代码还可以。有一个对象被多个共享\u ptr引用。您可以使用\u count来探究发生了什么:@Shawn停止在注释中回答您正在复制指针,而不是它指向的对象。我假设共享\u ptr的复制构造函数没有复制指针指向的对象。但我在这里担心的是,Foo构造函数中的this->bar
和bar
都是相同的引用,这意味着内存中实际上只有一个共享的\u ptr对象,但我有两个变量引用该共享的\u ptr。@AlexMussell您的代码还可以。有一个对象被多个共享\u ptr引用。您可以使用_count来了解发生了什么:@Shawn停止在评论中回答