关于C++中虚析构函数的一些问题——未加载 wntdll.padb

关于C++中虚析构函数的一些问题

对于虚析构函数的问题,在《C++面向对象程序设计》教材书上只是简单的提了一下,也就是P176页中。

我们知道虚析构函数的出现和多态性有一定的关系,即为了实现功能的晚绑定,能在基类派生的子类中可以充分释放基类中的成员,但是在使用多态性时,导致子类中的构析函数无法被调用

A a = new B();
delete a;

以上代码中只能使用A类中的构析函数,对于B类中新增的成员却无法实现释放。这个时候就需要将基类中的构析函数定义为虚析构函数(virtual标识)

class A {
	virtual ~A(){ cout<<"A::~A"<<endl;}
}
class B public A {
	~B(){ cout<<"B::~B"<<endl;}
}
········
int main(){
	·······
	A a = new B();
	delete a;
}

在此段代码的中输出结果为:
B::~B
A::~A
从结果可以知道,系统会首先调用派生类的析构函数,再调用基类的析构函数,这样两个对象中的成员均可以得到相应析构函数释放
舒畅的感觉,再也不便秘了

但是问题来了,对于单个对象多态性这样释放是没有问题,放到一个基类的数组指针也可以行得通吗?

····
	A *a[2] = {NULL};
	a[0] = new B();
	a[1] = new B();
//	delete[] a;   	//错误!
	for(int i = 0;i < 2;i++){
		delete a[i];
		a[i] = NULL;
	}		//释放成功!
····

在定义对象数组指针时有点可以注意的时必须让指针指向NULL,同时因为是数组,需要使用“{ }”
在这里插入图片描述
对于使用第一种错误释放方法就是上图错误啦,至于问题所在以后再去了解了,问题大致是内存空间问题吧,无法有序的释放一个数组指针,必须要是使用一个循环来释放,最好释放后吧指针指向NULL以免产生其他问题,养成好习惯。

最后小声逼一句,C++没有垃圾回收机制,导致开发时各种关于内存的报错,Java有GC垃圾回收机制,导致程序运行臃肿,但是对于新手入门友好,C++更加规范开发者开发习惯

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页