【发布时间】:2014-12-04 20:16:57
【问题描述】:
许多程序员提倡使用make_shared,因为它减少了键入并减少了编程错误。然而,在某些情况下,使用shared_ptr 的构造函数是不可避免的。其中一种情况是当您有一个希望shared_ptr 拥有的现有指针时,因为shared_ptr<Foo>(&existing_ptr) 是错误代码。相反,您必须使用笨拙的shared_ptr<Foo>(shared_ptr<Foo>(), p)。您不仅在重复自己,而且还必须创建一个临时对象。
int main()
{
using namespace std;
Foo foo;
foo.n = 1;
{
auto ptr = make_shared<Foo>(move(foo));
ptr->n = 42;
cout << ptr->n << " " << foo.n << '\n';
}
{
auto p = &foo;
auto ptr = shared_ptr<Foo>(shared_ptr<Foo>(), p);
ptr->n = 42;
cout << ptr->n << " " << foo.n << '\n';
}
return 0;
}
Foo::Foo()
Foo::Foo(Foo &&)
42 1
Foo::~Foo()
42 42
Foo::~Foo()
让shared_ptr 拥有现有指针的更简洁的方法是什么?
【问题讨论】:
-
&existing_ptr显然是错误的——你的意思是&existing_object。 -
shared_ptr<Foo>(&existing_ptr)完全不正确,但shared_ptr<Foo>(existing_ptr)有什么问题? -
@n.m.在这种情况下,
shared_ptr将尝试在销毁时删除指针,这将失败,因为指针未指向使用new分配的对象。 -
@MMarkRansom 想要一个无法删除的东西的 shared_ptr 有什么意义?
-
@n.m.不幸的是,有些人已经养成了在他们的函数签名中使用它的习惯,即使在不合适的时候也强迫你使用它。
标签: c++ c++11 memory memory-management shared-ptr