传递对采用 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.

的能力