从另一个 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。
说,我有一个 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。