我有一个get
函数返回MyClass
类型的对象称为myObject
:C++如何转换已创建对象的unique_ptr
MyClass myObject = something.get(id);
我想为myObject转换为uniqe_ptr
,怎么办呢?
std::unique_ptr<MyClass>(&myObject); //Is this correct?
我有一个get
函数返回MyClass
类型的对象称为myObject
:C++如何转换已创建对象的unique_ptr
MyClass myObject = something.get(id);
我想为myObject转换为uniqe_ptr
,怎么办呢?
std::unique_ptr<MyClass>(&myObject); //Is this correct?
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.
或者你可以使用'auto my_p_obj = std :: make_unique
@AndreasH。我不确定是否可以通过'make_unique'和一个拷贝构造函数来生成'unique_ptr'。谢谢你清理那个。我在答案上添加了一个编辑。 – GeorgeAl
如果你将与参考初始化,那么,当你走出的范围产生问题。一种可能性:
// Example program
#include <iostream>
#include <string>
#include <memory>
struct MyClass
{
};
int main()
{
MyClass myObject;
std::unique_ptr<MyClass>(new MyClass(myObject));
}
如果复制构造函数被删除,该怎么办? – user3828398
@ user3828398你可以'std :: move'吗? –
'std :: unique_ptr
想一想'unique_ptr'超出范围时会发生什么,它会尝试'删除'包含的指针,这个指针不指向用'new'分配的东西。 –
@GeorgeAl所以你的意思是'std :: unique_ptr(myObject);'? –
user3828398
当然,不是。 unique_ptr用于堆中分配的对象 – user3159253