原文:构造、析构期间被调虚函数发生的惨案,长教训!

最近有个问题出现长达一个月,经过两次修改未能解决,大致场景如下: 一个多态对象Children被注册回调 m observer对象位于基类Base中 ,正好在析构函数里面回调,导致crash。 第一次修改是通过在基类的base里面对observable对象取消回调订阅,来避免回调时对象不存在。 后来发现每个包含m observer的类都需要这么干,这样就多了很多重复代码,不够简洁,于是考虑进一步优 ...

2020-08-10 15:24 1 704 推荐指数:

查看详情

构造函数析构函数能是函数吗?

1. 为什么构造函数不能为函数函数的调用需要函数表指针,而该指针存放在对象的内容空间中;若构造函数声明为函数,那么由于对象还未创建,还没有内存空间,更没有函数表地址用来调用函数——构造函数了。 2. 为什么析构函数可以为函数,如果不设为函数 ...

Thu Sep 21 03:42:00 CST 2017 0 1523
函数构造析构函数执行顺序总结

一.定义 函数: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,可实现函数成员的动态重载。 纯函数: 纯函数是一种特殊的函数,在许多情况下,在基类中不能对函数给出有意义的实现,而把它声明为纯函数,它的实现留给该基类的派生类去做。含有纯函数的类被称为 ...

Fri Dec 22 04:03:00 CST 2017 0 2063
C++基/抽象类的构造/析构(纯)函数

一、析构函数可定义为纯函数,但也必须给出函数定义   Effective C++ 条歀07: 为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base classes)   在某些类里声明纯析构函数很方便。纯 ...

Tue Feb 04 01:42:00 CST 2020 0 839
构造函数为什么不能为函数 & 基类的析构函数为什么要为函数

一、构造函数为什么不能为函数 1. 从存储空间角度,函数相应一个指向vtable函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的。问题出来了,假设构造函数的,就须要通过 vtable来调用,但是对象还没有 ...

Wed Oct 08 23:41:00 CST 2014 0 3998
构造函数为什么不能声明为函数析构函数为什么要声明为函数

多态中的函数表是在运行时创建的还是编译时创建的? 答:函数表在编译的时候就确定了,而类对象的函数指针vptr是在运行阶段确定的,这是实现多态的关键 (类的函数的调用并不是在编译时就确定的,而是在运行时才确定的,由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以声明 ...

Wed Oct 31 20:07:00 CST 2018 0 1311
 
粤ICP备18138465号  © 2018-2026 CODEPRJ.COM