加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 自动对象销毁

发布时间:2020-12-16 10:19:59 所属栏目:百科 来源:网络整理
导读:自动对象(在堆栈上创建的对象)的销毁是否可以保证在它们超出范围之前执行? 澄清: #include iostreamclass A { public: A() { std::cout "1"; } ~A() { std::cout "3"; }};void test123() { A a; std::cout "2";} 要打
自动对象(在堆栈上创建的对象)的销毁是否可以保证在它们超出范围之前执行?

澄清:

#include <iostream>

class A {
  public:
    A() {
      std::cout << "1";
    }
    ~A() {
      std::cout << "3";
    }
};

void test123() {
  A a;
  std::cout << "2";
}

要打印“2”,不再需要a,所以从理论上讲,编译器可以在不再需要时尝试优化和销毁a.

我可以依靠以上功能始终打印123吗?

解决方法

严格定义堆栈对象的销毁顺序 – 当您离开作用域时(通过运行{}的结尾,或通过返回或异常),它们以与声明相反的顺序执行.所以,你总会在那里看到123.

但请注意,编译器优化由“as-if”规则控制.换句话说,编译器可以尽早销毁对象,只要生成的程序表现为’as-if’它在正常时被销毁.在这种情况下,因为您输出,编译器必须在适当的时间安排输出.但是,例如,如果您删除了指向基本类型的指针,并且编译器可以证明没有其他未指向该值的指针,原则上它可以更早地移动该删除.关键是没有符合要求的程序能够注意到这种优化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读