创建shared_ptr而不复制实例

时间:2017-04-06 15:20:48

标签: c++

我希望我的问题过去没有发布过(我搜索过但我想我没有使用正确的关键字,无法找到任何内容)。

我想知道,有没有办法在不复制实例的情况下创建shared_ptr?我的意思是,我看到make_shared重新创建了我们作为参数传递的内容。所以我尝试使用class Ashared_ptr(this)中进行此操作,但我不确定它是否按预期工作。

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

感谢您的回答

2 个答案:

答案 0 :(得分: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 :(得分:2)

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

是的,在这种情况下,sptr将成为新的shared_pointer实例,其中包含新创建的someInstance副本(如果A类已定义公共副本构造函数 - 隐式或显式)。

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

汇总:

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

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