记录遇到过的一个坑:C++基类析构函数写成虚函数

本文记录了在C++编程中遇到的一个问题,即基类析构函数未声明为虚函数导致的编译警告。当使用基类指针删除子类对象时,可能会引起未定义行为,如内存泄漏。通过理解undefined behaviour的概念,作者强调了在多态类中定义虚析构函数的重要性,以确保正确地调用子类析构函数并避免内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写了一个C++的程序,类似于是这样的框架:

#include<iostream>
using namespace std;

class BaseClass{
public:
	virtual void output(){
		cout<<"BaseClass"<<endl;
	}
};

class DerivedClass:public BaseClass{
public:
	virtual void output(){
		cout<<"DerivedClass"<<endl;
	}
};
int main(){
	BaseClass *p=new DerivedClass();
	p->output();
	delete p;
	return 0;
}

在编译过程中遇到了这样的一个警告:Warning: deleting object of polymorphic class type 'BaseClass' which has non-vitrual destructor might cause undefined behaviour。

简单来说,就是我新建了一个子类对象,用基类指针指向这个子类对象,对于基类对象进行delete操作的时候产生的这个警告。它的意思是BaseClas是一个多态类,但是它的析构函数不是虚函数,有可能程序会造成undefined behaviour。

那么什么是undefined behaviour?举个例子来说,如果我们的程序中,DerivedClass对象申请了内存空间,并且在DerivedClass的析构函数中释放内存空间,但是基类和子类的析构函数并不是虚函数,运行上面的程序,基类指针指向子类对象,基类指针进行delete操作销毁子类对象,调用析构函数,则只会调用基类的析构函数,子类对象申请的内存空间没有被释放,造成内存泄漏的undefined behaviour。如果将析构函数改为虚函数,则不会产生这样的警告,首先调用子类的析构函数,随后调用基类的析构函数:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值