網站首頁 編程語言 正文
在寫Qt應用程序時,由于是采用C++語言,經常會碰到一個令人棘手的問題,那就是內存泄漏,雖然后面C++為了防止內存泄漏,發布了智能指針以用來避免內存泄漏,但是并不能完全避免。而且智能指針使用不當,同樣會造成非常嚴重的問題。這里智能指針就不在贅述,有機會我再寫篇智能指針的博客。
??? 為了預防內存泄漏問題,我們手動寫一個宏,用來監測該類是否析構,若未析構,則將該類打印出來,這樣可以更好的定位問題。代碼如下:
定義一個幫助類,用來計數,當注冊的類聲明時,計數+1,當類析構時,計數-1,若在該類析構時,計數大于0,則該注冊的類未析構,則打印出來,提示開發者出現內存泄漏問題,告訴是哪個類未析構
class CountCheckerHelper { public: CountCheckerHelper(const char *className, const char *fileName) : m_className(className) , m_fileName(fileName) , m_refCount(0) { } ~CountCheckerHelper() { if (m_refCount > 0) { qDebug() << m_fileName << m_className << "is not delete..."; } } void operator ++() { ++m_refCount; } void operator --() { --m_refCount; } private: const char *m_className; const char *m_fileName; unsigned int m_refCount; }; #define CAPTURE_MEMORY_LEAK(ClassName) \ class CountChecker \ { \ public: \ CountChecker() \ { \ ++counter(); \ } \ ~CountChecker() \ { \ --counter(); \ } \ private: \ CountCheckerHelper &counter() \ { \ static CountCheckerHelper instance(#ClassName, __FILE__);\ return instance; \ } \ } countChecker; \
利用static局部變量的生存周期,當程序退出時,靜態局部變量析構,此時CountCheckerHelper析構,若此時注冊的類的計數大于0,則證明該注冊的類內存泄漏,將該宏寫入到你的類的如下位置,其實就是聲明一個內部類,并創建這個內部類的對象。
class Object { CAPTURE_MEMORY_LEAK(Object) public: Object() { } }; int main() { Object *object = new Object(); return 0; }
結果:打印出內存泄漏的文件,以及泄漏的類名Object
?
原文鏈接:https://blog.csdn.net/yinyuchen1/article/details/121757439
相關推薦
- 2022-06-07 Jenkins?腳本命令行應用小結_相關技巧
- 2022-04-14 解決Mac環境下zsh: command not found:
- 2022-07-27 C#?泛型集合類List<T>使用總結_C#教程
- 2023-03-01 C++?使用?new?創建二維數組實例_C 語言
- 2022-11-17 Python?隊列Queue和PriorityQueue解析_python
- 2022-09-21 淺析C++函數模板和類模板_C 語言
- 2022-08-13 Redis - 時間序列數據類型的保存方案和消息隊列實現
- 2023-03-04 Golang中goroutine和channel使用介紹深入分析_Golang
- 最近更新
-
- 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同步修改后的遠程分支