通过std :: unique_ptr扩展变量的生命周期

时间:2013-08-14 00:53:37

标签: c++ unique-ptr

使用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 = X
c = Y

通常在范围结束时释放的字符c将一直存在,直到程序结束。第二个输出为“Y”,表示unique_ptr不会简单地复制其值。

是否建议以某种方式延长变量的寿命?
这是安全的,还是带有与参考相同的危险?

1 个答案:

答案 0 :(得分:8)

  

使用C ++ 11 unique_ptr,可以扩展对象的生命周期   超出其通常范围

不,它不能。

  

字符c,通常会在结尾处释放   范围,直到计划结束。

不,它没有,它一直存在,直到示波器结束,正常。

  

第二个输出是&#39; Y&#39;,表明unique_ptr不是简单的   复制它的价值。

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

  

是否建议以某种方式延长变量的寿命?安全吗......

显然没有,没有。

  

或它是否带有与参考相同的危险?

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