網站首頁 編程語言 正文
一、問題引入
使用多態時,如果有一些子類的成員開辟在堆區,那么在父類執行完畢釋放后,沒有辦法去釋放子類的內存,這樣會導致內存的泄漏。如下代碼段。
如果沒有堆區的數據,可以不寫虛析構或純虛析構。
#include <iostream>
#include <string>
using namespace std;
class Animal{
public:
Animal(){
cout<<"Animal-構造"<<endl;
}
~Animal(){
cout<<"Animal-析構"<<endl;
}
virtual void Run()=0; //純虛函數無需實現,只需聲明
};
class Cat:public Animal{
public:
string *s_name;
Cat(string name){
s_name = new string(name);//在堆區創建內存
cout<<"Cat-構造"<<endl;
}
void Run()
{
cout<<*s_name<<"->"<<"Cat-Run"<<endl;
}
~Cat(){
cout<<"Cat-析構"<<endl;
if(s_name!=NULL){
delete s_name;
s_name=NULL;
}
}
};
int main()
{
Animal *a;
a = new Cat("Tom");
a->Run();
delete a; //父類指針析構的時候,不會調用子類析構函數
return 0;
}
運行結果:
結果可以看到都有父類和子類的構造,雖然在主函數中delete 父類,但最終只有父類的析構函數,此時子類在堆區創建的s_name并沒有得到釋放,導致內存泄漏。
以上的問題我們引入虛析構和純虛析構來解決——父類指針釋放子類對象時不干凈的問題
二、利用虛析構解決
虛析構只需要在析構函數前加關鍵字 virrtual 即可,再觀察結果,可以看到父類和子類的都執行了析構函數,而子類中在堆區創建的數據也被釋放干凈,這是最終的結果!
virtual ~Animal(){
cout<<"Animal析構"<<endl;
}
三、利用純虛析構解決
純虛析構格式如下,和純虛函數有點類似,但需要有具體的聲明和具體的實現。純虛析構需要在類外實現.
class Animal{
public:
Animal(){
cout<<"Animal-構造"<<endl;
}
//虛析構
/*virtual ~Animal(){
cout<<"Animal析構"<<endl;
}*/
//純虛析構
virtual ~Animal()=0;
virtual void Run()=0; //純虛函數無需實現,只需聲明
};
//需要有聲明,也需要有實現
Animal::~Animal(){
cout<<"純虛析構"<<endl;
}
結果如下,和虛析構有相同的作用
四、總結
虛析構和純虛析構
相同點: 都可以解決父類指針釋放子類對象,都需要有具體的實現
不同點: 純虛析構屬于抽象類,無法實例化對象
原文鏈接:https://blog.csdn.net/qq_53734051/article/details/126478376
相關推薦
- 2022-06-02 Apache教程Hudi與Hive集成手冊_服務器其它
- 2022-06-12 ASP.NET?Core?WebApi返回結果統一包裝實踐記錄_實用技巧
- 2022-04-14 python實現購物車小程序_python
- 2022-07-18 Stack和Queue容器的系列操作( 詳解 )
- 2022-04-17 Mac使用pandoc 將docx文件轉換成html文件 快速實現協議文件的轉換
- 2023-11-19 Linux虛擬機VMware的Ubuntu使用vi指令的方向鍵和backspace空格鍵亂碼
- 2022-07-12 oracle?指定類型和指定位數創建序列號的代碼詳解_oracle
- 2021-11-26 Redis分布式鎖詳細介紹_Redis
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支