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停止在评论中回答