2016-05-12 38 views
0

我有一个get函数返回MyClass类型的对象称为myObjectC++如何转换已创建对象的unique_ptr

MyClass myObject = something.get(id); 

我想为myObject转换为uniqe_ptr,怎么办呢?

std::unique_ptr<MyClass>(&myObject); //Is this correct? 
+1

想一想'unique_ptr'超出范围时会发生什么,它会尝试'删除'包含的指针,这个指针不指向用'new'分配的东西。 –

+0

@GeorgeAl所以你的意思是'std :: unique_ptr (myObject);'? – user3828398

+0

当然,不是。 unique_ptr用于堆中分配的对象 – user3159253

回答

5
MyClass myObject = something.get(id); 

蕴涵复制或移动建设。

如果你的拷贝构造函数的定义,并宣布公开尝试以下

std::unique_ptr<MyClass> my_p_obj(new MyClass(myObject)); 

当你创建一个新对象,并通过复制初始化。

否则在你的例子中,对象是通过移动建设初始化

std::unique_ptr<MyClass> my_p_obj(new MyClass(std::move(myObject))); 

有什么不对的std ::的unique_ptr(& myObject的);

myObject是在局部范围内,当它位于所述功能到达端(}),其将被破坏的对象。如果你调用析构函数两次(一个由编译器,第二从unique_ptr)你未定义行为

编辑:正如在评论清理,你可以利用它auto my_p_obj = std::make_unique<MyClass>(myObject)做同样的事情。 - 谢谢,Andreas H.

+1

或者你可以使用'auto my_p_obj = std :: make_unique (myObject)',它和'std :: unique_ptr my_p_obj(new MyClass(myObject))'做的功能基本相同。 –

+1

@AndreasH。我不确定是否可以通过'make_unique'和一个拷贝构造函数来生成'unique_ptr'。谢谢你清理那个。我在答案上添加了一个编辑。 – GeorgeAl

0

如果你将与参考初始化,那么,当你走出的范围产生问题。一种可能性:

// Example program 
#include <iostream> 
#include <string> 
#include <memory> 

struct MyClass 
{ 
}; 

int main() 
{ 
    MyClass myObject; 
    std::unique_ptr<MyClass>(new MyClass(myObject)); 
} 
+0

如果复制构造函数被删除,该怎么办? – user3828398

+2

@ user3828398你可以'std :: move'吗? –

+0

'std :: unique_ptr (&myObject)有什么问题;'? – user3828398