使用 C++11 unique_ptr ,对象的生命周期似乎超出了其通常的范围,如下面(相当人为的)示例所示:

#include <iostream>
#include <memory>

using namespace std;

int main()
{
    unique_ptr<char> uPtr(nullptr);
    {
        char c = 'X';
        cout << "c = " << c << endl;
        uPtr.reset(&c);
        c = 'Y';
    }
    cout << "c = " << *uPtr << endl;

    return 0;
}

输出:c = Xc = Y
通常在作用域结束时释放的字符 c 会一直存在到程序结束。第二个输出是“Y”,表明 unique_ptr 不是简单地复制其值。

是否建议以某种方式延长变量的生命周期?
这是安全的,还是与引用相同的危险?

最佳答案



不,不能。



不,它不会,它会像往常一样存活到范围结束。



你说得对,unique_ptr 不会复制它指向的值。但是您在此处的输出无关紧要,因为当您取消引用该指针时,您的代码具有未定义的行为,因为它指向的对象不再存在。当 unique_ptr 被销毁时,代码再次具有未定义的行为,并在该位置调用 delete(尽管您可以提供无操作删除器)。



显然没有和没有。



是的,这类似于从函数返回对局部变量的引用。它甚至更类似于有一个悬空指针并取消引用它,另外还有在该位置调用 delete 以获得额外的未定义行为。

关于c++ - 通过 std::unique_ptr 扩展变量的生命周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18221555/

10-10 10:20