传递对采用 std::unique_ptr 的函数的引用
Pass reference to function that takes `std::unique_ptr`
我有一个对我的 MyType
类型对象的引用,但我需要调用一个函数,比如 myFunction
接受 std::unique_ptr<MyType>
。 myFunction
的正确调用方式是什么?我在下面的尝试似乎导致了“无效指针”错误:
#include <memory>
class MyType {};
MyType myGlobalObj;
MyType& myGetter () {
return myGlobalObj;
}
void myFunction (std::unique_ptr<MyType> ptr) {
// Do important stuff
}
int main () {
MyType& myObj = myGetter();
std::unique_ptr<MyType> myPtr;
myPtr.reset(&myObj);
myFunction(std::move(myPtr)); // This causes "invalid pointer" at run time.
myPtr.release();
return 0;
}
如果不对 myGlobalObj
进行(深度)复制或修改 myFunction
.
,您将无法完成您想要做的事情
A std::unique_ptr
获得用于存储所包含对象的内存的所有权。这意味着 std::unique_ptr
可以释放(或重新分配,或其他)它 'owns' 的内存。在你的情况下它会做什么:一旦 ptr
变量在 myFunction
结束时超出范围,它将尝试释放它指向的内存。由于 myGlobalObj
是一个全局变量,它的内存可能永远不会被释放(在程序受控关闭之前......)
因此,您不应该将全局对象转换为 std::unique_ptr
(或 std::shared_ptr
)。如果真的没有办法重构该方法以采用 std::unique_ptr
以外的任何其他方法,则必须复制(在堆上!)myGlobalObj
,将其包装到 std::unique_ptr
,并将其传递给 myFunction
。请记住,这样一来,myFunction
就失去了修改 myGlobalObj
.
的能力
我有一个对我的 MyType
类型对象的引用,但我需要调用一个函数,比如 myFunction
接受 std::unique_ptr<MyType>
。 myFunction
的正确调用方式是什么?我在下面的尝试似乎导致了“无效指针”错误:
#include <memory>
class MyType {};
MyType myGlobalObj;
MyType& myGetter () {
return myGlobalObj;
}
void myFunction (std::unique_ptr<MyType> ptr) {
// Do important stuff
}
int main () {
MyType& myObj = myGetter();
std::unique_ptr<MyType> myPtr;
myPtr.reset(&myObj);
myFunction(std::move(myPtr)); // This causes "invalid pointer" at run time.
myPtr.release();
return 0;
}
如果不对 myGlobalObj
进行(深度)复制或修改 myFunction
.
A std::unique_ptr
获得用于存储所包含对象的内存的所有权。这意味着 std::unique_ptr
可以释放(或重新分配,或其他)它 'owns' 的内存。在你的情况下它会做什么:一旦 ptr
变量在 myFunction
结束时超出范围,它将尝试释放它指向的内存。由于 myGlobalObj
是一个全局变量,它的内存可能永远不会被释放(在程序受控关闭之前......)
因此,您不应该将全局对象转换为 std::unique_ptr
(或 std::shared_ptr
)。如果真的没有办法重构该方法以采用 std::unique_ptr
以外的任何其他方法,则必须复制(在堆上!)myGlobalObj
,将其包装到 std::unique_ptr
,并将其传递给 myFunction
。请记住,这样一来,myFunction
就失去了修改 myGlobalObj
.