許多程序員主張使用make_shared
,因爲它減少了鍵入操作並減少了編程錯誤。然而,在某些情況下,使用shared_ptr
的構造函數是不可避免的。其中一種情況是當您有一個現有指針時,您想要shared_ptr
擁有,因爲shared_ptr<Foo>(&existing_ptr)
是錯誤的代碼。相反,你必須使用笨拙的shared_ptr<Foo>(shared_ptr<Foo>(), p)
。你不僅要重複自己,還必須創建一個臨時對象。更簡單的方法讓shared_ptr擁有一個現有的指針
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'。 – Yakk 2014-10-09 19:29:58
'shared_ptr(&existing_ptr)'只是不正確的,但'shared_ptr (existing_ptr)'有什麼錯誤? –
2014-10-09 19:37:08
@ n.m。在這種情況下''shared_ptr'會嘗試刪除銷燬指針,這將失敗,因爲指針不指向分配'new'的對象。 – 2014-10-09 19:43:13