从另一个 shared_ptr 的原始指针创建 shared_ptr

Making shared_ptr from the raw pointer of another shared_ptr

说,我有一个 shared_ptr<A> ptrFirst,它已初始化并指向内存中的某个对象。现在,我像这样定义一个新的 shared_ptr

shared_ptr<A> ptrSecond = make_shared<A>(ptrFirst.get());

我知道我可以使用简单的赋值来防止出现任何问题。但是我想知道如果我这样定义ptrSecond,我会不会对同一个对象有两个不同的控制块?这还很糟糕吗?

除非你有一个将 A* 作为唯一参数的构造函数,否则你的行将无法编译。

如果您有构造函数 A::A(A*),那么 make_shared 将创建一个新对象 - 这很好。

如果您改用 std::shared_ptr 构造函数:

std::shared_ptr<A> ptrSecond = std::shared_ptr<A>(ptrFirst.get());

那就是问题了。这将导致双重释放,即UB。

But I wonder if I define ptrSecond this way, will I have two different control blocks for the same object?

没有。此代码:

shared_ptr<A> ptrSecond = make_shared<A>(ptrFirst.get());

在逻辑上等于:

shared_ptr<A> ptrSecond( new A( ptrFirst.get() ) );

所以基本上它会创建 A 的新实例并用指向另一个 A 的指针初始化它,当然只有当你定义了正确的 ctor 时它才会编译。

Is this even bad?

如果你的意思是这样的:

    shared_ptr<A> ptrSecond( ptrFirst.get() );

是的,这很糟糕,因为它会由于双重释放而导致 UB。