首页 >后端开发 >C++ >C 中的对象是如何被销毁的?

C 中的对象是如何被销毁的?

Barbara Streisand
Barbara Streisand原创
2024-12-10 09:45:12649浏览

How Are Objects Destroyed in C  ?

C 中的对象销毁

作用域对象

自动对象: 当封闭范围时,以与定义相反的顺序销毁结论是。
非局部静态对象: 在执行 main(全局变量、静态成员数据)后,以与定义相反的顺序销毁。
本地静态对象: 控制流第一次传递其定义时构造,并销毁执行 main 后按相反顺序(函数内的静态变量)。

基类和成员子对象:**

以与定义相反的顺序销毁,首先是成员子对象,然后是基类子对象。

数组元素:**

按降序销毁。如果在构造第 n 个元素期间发生异常,则首先析构元素 n-1 到 0。

临时对象:**

在计算类类型的纯右值表达式时构造。当包含表达式完成求值时被销毁。如果在求值期间发生异常,临时对象将被正确销毁。

动态对象和数组:**

动态对象: 使用 new Foo 分配并使用 delete p 销毁.
动态数组: 分配新的 Foo[n] 并销毁with delete[] p.

在这两种情况下,尝试多次销毁内存、销毁后访问或使用不正确的销毁机制(例如,针对单个对象的 delete[])会导致未定义的行为。如果在构造过程中发生异常,则会在异常传播之前释放动态分配的内存。

引用计数智能指针:**

std::shared_ptr: 销毁托管对象作为最后一个 std::shared_ptr;引用它的对象被破坏。

异常行为:

析构函数不应该抛出异常,因为这可能会终止程序。如果在对象销毁期间发生异常,则会传播该异常,并且所有先前被销毁的子对象都会被正确销毁。但是,如果动态对象在构造过程中发生异常,则会在异常传播之前释放内存,并且不会调用该对象的析构函数。

以上是C 中的对象是如何被销毁的?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn