2017-04-06 112 views
1

我希望我的问题没有发布在过去(我搜索过,但我想我没有使用正确的关键字,找不到任何东西)。创建shared_ptr而不复制实例

我想知道,有没有办法在不复制实例的情况下创建shared_ptr?我的意思是,我看到make_shared重新创建了我们通过的参数。所以我试图在class Ashared_ptr(this)这样做,但我不确定它是否按预期工作。

shared_ptr(raw pointer)究竟做了什么?它只是存储指针还是使用复制构造函数创建一个新实例并存储其指针?

谢谢您的回答

+0

见3号[这里](http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr)关于第二个问题。我不确定你在第一个问题中要求什么。 – NathanOliver

+2

您可能想了解['std :: enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)。 –

+0

'shared_ptr(raw_pointer)'将把'raw_pointer'指向的现有对象的所有权赋予新的'shared_ptr'。当新的'shared_ptr'及其所有副本被销毁时,它将被删除。 “this”引用的对象没有拷贝。 'std :: make_shared (* this)'会产生新的'shared_ptr'拥有的对象的新副本。 –

回答

3

我认为你是困惑,指针的行为...也许?很难破译你所问的。

我会考虑用刺虽然下面的解释:

std::shared_ptr<int> mySharedPtr(new int(5)); 

创建一个且只有一个int的实例。

int * myPointer = new int(5); 
std::shared_ptr<int> mySharedPtr = myPointer; 

也创建了一个且只有一个int实例。

int * myPointer = new int(5); 
std::shared_ptr<int> mySharedPtrA = myPointer; 
std::shared_ptr<int> mySharedPtrB = mySharedPtrA; 

也创建一个且只有一个int实例。

std::shared_ptr<int> mySharedPtrA = std::make_shared<int>(5); 
std::shared_ptr<int> mySharedPtrB = mySharedPtrA; 

也创建了一个且只有一个int实例。

在所有这些情况下,int的值是5,有一个实例,并且指向int的指针正在传递。

int不会被传递,指向int的指针是。 int未被复制,指向int的指针正在被复制。

1
A someInstance; 
auto sptr = std::make_shared<A>(someInstance) 

是的,在这种情况下sptr会随着someInstance新创建的副本(如果A类定义了公共的拷贝构造函数 - 隐性或显性的)新shared_pointer实例。

std::make_shared(...)是什么?它“尝试”根据给定的参数列表匹配正确的构造函数。在这种情况下,你传递了'A const &',它将与复制构造函数匹配。

汇总:

  • std::shared_ptr<T>(...)创建从std::shared_ptr

    • 其他的shared_ptr,
    • std::unique_ptr<T>
    • 指针T的
    • (空的shared_ptr)
  • std::make_shared<T>创建std::shared_ptr<T>使用T构造