【问题标题】:Expanded life-span of variables through std::unique_ptr通过 std::unique_ptr 扩展变量的寿命
【发布时间】:2013-08-14 00:53:37
【问题描述】:

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

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

【问题讨论】:

  • “对象的生命周期可以延长到其通常范围之外” -- 不,不能。您的程序有未定义的行为。
  • 请记住,未定义行为的最严重症状是您的程序表现得像您想要的那样。总是质疑一个工作程序......;)

标签: c++ unique-ptr


【解决方案1】:

使用 C++11 unique_ptr,可以延长对象的寿命 超出正常范围

不,它不能。

字符 c,通常在结束时释放 范围,直到程序结束。

不,它不会,它会一直存在到作用域结束,就像正常一样。

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

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

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

显然没有,也没有。

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

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

【讨论】:

  • 好吧,如果我理解正确的话,unique_ptr 仍然指向曾经是变量的地址。因为它的模板类型是char,它读取那个位置的数据(不管它是否被覆盖)作为一个字符并输出。删除后,unique_ptr 将尝试删除该位置的数据,就像删除一个字符一样,可能会破坏现在分配给该空间的其他资源。
  • @watarok:这是对大多数实现中大部分时间可能发生的事情的准确描述。请记住,“未定义的行为”就是这个意思。行为未定义,就标准而言,任何事情都可能发生。
  • 实际上,我希望在实际实现中还有其他内容:不要写入c,因为它的单一正确用法(cout &lt;&lt; 的参数)可以直接替换。 (调试版本显然除外)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2018-07-18
  • 2017-08-21
  • 2019-10-03
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多