使用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
不会简单地复制其值。
是否建议以某种方式延长变量的寿命?
这是安全的,还是带有与参考相同的危险?
答案 0 :(得分:8)
使用C ++ 11 unique_ptr,可以扩展对象的生命周期 超出其通常范围
不,它不能。
字符c,通常会在结尾处释放 范围,直到计划结束。
不,它没有,它一直存在,直到示波器结束,正常。
第二个输出是&#39; Y&#39;,表明unique_ptr不是简单的 复制它的价值。
你是对的,unique_ptr
不会复制它指向的值。但是这里的输出是无关紧要的,因为当您取消引用该指针时,您的代码具有未定义的行为,因为它指向的东西不再存在。当unique_ptr
被销毁时,代码会再次出现未定义的行为,并在该位置调用delete
(尽管您可以提供no-op删除器)。
是否建议以某种方式延长变量的寿命?安全吗......
显然没有,没有。
或它是否带有与参考相同的危险?
是的,这类似于从函数返回对局部变量的引用。它更像是悬挂指针并取消引用它,另外在该位置调用delete
以获得额外剂量的未定义行为。