4

使用 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不简单地复制它的值。

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

4

1 回答 1

8

使用 C++11 unique_ptr,可以将对象的生命周期扩展到其通常范围之外

不,它不能。

通常在作用域结束时释放的字符 c 会一直存在到程序结束。

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

第二个输出是“Y”,表明 unique_ptr 并不简单地复制它的值。

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

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

显然没有,也没有。

还是它与参考具有相同的危险?

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

于 2013-08-14T01:09:57.100 回答