首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C++中的析构函数中允许做什么?

在C++中的析构函数中允许做什么?
EN

Stack Overflow用户
提问于 2021-05-18 02:46:49
回答 1查看 152关注 0票数 4

我在试着理解在析构函数中允许做什么。

标准说:“对于具有非平凡析构函数的对象,在析构函数完成执行后引用对象的任何非静态成员或基类会导致未定义的行为”。

优先选择以这种方式描述销毁序列:“对于用户定义或隐式定义的析构函数,在执行析构函数的主体后,编译器调用类的所有非静态非变体成员的析构函数”。

这是否意味着,在下面的代码中,从其成员的析构函数调用方法是UB?或者说“参照”标准指的是一些特殊的东西?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Foo {
  Foo(Callback cb) : cb_(cb) {}

  ~Foo() {
    // body of Bar destructor finished at this moment;
    // cb_() calls Bar::call_me()
    cb_();
  }

  Callback cb_;
};

struct Bar {
  // pass callback with captured this
  Bar() : foo_([this]() { call_me(); }) {
  }

  void call_me() {
  }

  // foo is a member, its destructor will be called after Bar destructor
  Foo foo_;
};

另外,标准中的“析构函数完成后”这个短语到底意味着什么?在破坏者的身体完成之后?或者在所有的成员和基类被摧毁之后?

我认为最后一个问题的答案是理解什么是允许的和什么是不允许的关键。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-18 03:12:32

Bar的析构函数尚未完成,因此引用Bar的一个成员,实际上在其析构函数中调用Bar的成员函数是可以的。

但是,调用超级对象的成员函数可能有点不稳定,因为成员函数可以访问子对象,并且在调用成员函数时某些子对象可能已经被销毁,在这种情况下,访问被破坏的对象将导致未定义的行为。在您的示例中,情况并非如此。

或者说“参照”标准指的是一些特殊的东西?

我认为这意味着形成一个指针或一个对子对象的引用。正如在下面的示例中所做的那样。

另外,标准中的“析构函数完成后”这个短语到底意味着什么?在破坏者的身体完成之后?或者在所有的成员和基类被摧毁之后?

后者。

主体首先执行,然后析构函数调用子对象析构函数,然后析构函数完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67584695

复制
相关文章
C++中类的构造函数和析构函数
构造函数 对象创建的时候执行 student s //空参构造函数 栈内存中 student s("测试")//带参构造函数 栈内存中 或者 student *s=new student//空参构造函
乱码三千
2021/07/29
2K0
C++中类的构造函数和析构函数
Python中的析构函数
👨‍🎓作者:Java学术趴 🏦仓库:Github、Gitee ✏️博客:CSDN、掘金、InfoQ、云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。 ☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的! 👋大家好!我是你们的老朋友Java学术趴。析构函数(destructor) 与构造函数相反
Java学术趴
2022/06/10
1.2K0
Python中的析构函数
C++中构造函数、虚函数、析构函数的执行顺序
#include <iostream> using namespace std; class A { public: // 第一步:执行类A的构造函数,输出"构造函数A" A() { cout << "构造函数A" << endl; } virtual void func() { cout << "构造A" << endl; } // 第七步:执行类A的析构函数,输出"析构函数A" ~A() { cout << "析构函数A" <<
越陌度阡
2020/11/26
2.3K0
多态中的虚析构函数
因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。
WindSun
2019/08/30
7790
C++:39---继承中构造函数、析构函数的关系
一、继承中构造函数的关系 如果父类没有构造函数,则子类初始化时不需要构造父类 如果父类有构造函数,则子类初始化自己的构造函数时,要先初始化父类的构造函数 基类的构造函数必须在派生类的构造函数初始化列表来进行初始化 总结:在构造自己(子类)之前,需要先构造父类 演示案例 例如:下面的父类A有构造函数,则子类B在初始化构造函数时,必须要构造父类A class A //父类 { int a_data; public: A(int data) { a_data = data; } ~A() {}//5 }; cla
用户3479834
2021/02/03
1.1K0
11.7 C++析构函数
C++析构函数是一个特殊的成员函数,作用与构造函数相反,它的名字是类名的前面加一个~符号,析构函数是与构造函数作用相反的函数,当对象的生命期结束时,会自动执行析构函数。
小林C语言
2021/06/03
3.1K0
11.7 C++析构函数
C++构造/析构函数
当类的成员变量中存在类时候,同时成员类没有无参或默认构造函数,在创建该类的对象时候会出错。这是需要使用初始化列表。将需要的成员变量进行初始化。
用户2929716
2018/08/23
7080
C++不要在构造函数和析构函数中调用虚函数
虽然可以对虚函数进行实调用,但程序员编写虚函数的本意应该是实现动态联编。在构造函数中调用虚函数,函数的入口地址是在编译时静态确定的,并未实现虚调用。但是为什么在构造函数中调用虚函数,实际上没有发生动态联编呢?
恋喵大鲤鱼
2018/08/03
3.8K0
C++学习笔记 -- 虚析构函数与纯虚析构函数
一个类维护一个虚函数相关的表--vtable(__vfptr指向它),函数声明前面包含关键字“virtual”的函数,就会创建一个指向该函数的指针(函数指针)被存入vtable中。
meteoric
2018/11/16
1.7K0
【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )
上述 继承 的过程中 , 每一层继承 , 都继承了上一级 父类的 成员变量 , 同时自己也定义了新的成员变量 ;
韩曙亮
2023/10/23
2540
【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )
C++虚析构函数解析
 当派生类对象从内存中撤销时一般先运行派生类的析构函数,然后再调用基类的析构函数。 如果用new运算符建立的派生类的临时对象,对指向基类的指针指向这个临时对象当用delete运算符撤销对象时,系统执行的是基类的析构函数,而不是派生类的析构函数,不能彻底的“清理现场”。解决的方法是将基类及派生类的析构函数设为虚函数,这时无论基类指针指向哪个派生类对象,系统会采用动态关联,调用相应的析构函数对对象进行清理。 class Point { public :           Point(){};       
hbbliyong
2018/03/06
9650
C++虚析构函数解析
C++ 构造函数和析构函数
在C++的学习中,可以把类当作一个模具,类所实例化出来的对象就是根据这个模具所产生的实体,对象可以看作是我们自己创建的一个新的数据类型。本文主要介绍了类对象通过拷贝函数进行初始化,分析了类对象的内存模型,以及通过this指针来实现更复杂的功能。最后介绍了析构函数的基础知识。
呆呆
2021/07/05
9740
【C++】构造函数与析构函数
原因:程序中对象的创建和销毁是一个非常特殊的事情,有编译器来调用它们来完成,而这里的构造函数和析构函数便是创建和销毁的两个函数,它们是作为钩子函数来被编译器调用的。
灰子学技术
2020/04/02
1K0
C++:构造函数与析构函数
构造函数用于对象的初始化,一旦建立对象,就需要有一个有意义的初始值,构造函数的作用即是在对象初始化时被调用,给对象分配内存空间以及完成初始化。
字节星球Henry
2021/08/09
5630
c++——构造函数和析构函数
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情
lovevivi
2022/12/21
5850
c++——构造函数和析构函数
C++构造函数和析构函数中抛出异常的注意事项
从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数和析构函数中尽量不要抛出异常,万不得已,一定要注意防止资源泄露。在析构函数中抛出异常还要注意栈展开带来的程序崩溃。
恋喵大鲤鱼
2018/08/03
2.4K0
【C++】C++构造函数和析构函数
C++提供构造函数来处理对象的初始化。 构造函数是一种特殊的成员函数,不需要用户来调用,定义对象时被自动执行。 构造函数名字与类名相同,无返回类型(void也不能有哦)。
谙忆
2021/01/21
6190
【C++】构造函数与析构函数用途 ( 代码示例 - 构造函数与析构函数用途 )
在 C++ 语言中 , " 构造函数 " 和 " 析构函数 " 都是 C++ 类中的 特殊函数 , 分别用于
韩曙亮
2023/10/15
1930
【C++】构造函数与析构函数用途 ( 代码示例 - 构造函数与析构函数用途 )
析构函数
当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。在C++语言中:析构函数名应与类名相同,只是在函数名前面加一个位取反符 ~ ,例如 ~ stud( ),以区别于构造函数。 它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。 如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。
海盗船长
2020/08/27
9790
C++类的构造函数与析构函数
C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。
Masimaro
2018/08/31
1.6K0

相似问题

C++中的析构函数

60

C++中的析构函数

91

C++中的析构函数

32

在C++中查看析构函数

32

c++中的析构函数概念

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文