內存泄漏出現的時機和原因,如何避免?

由于時間比較緊張我就不排版了,但是對于每一種可能的情況都會出對應的代碼示例以及解決方案代碼示例。

內存泄漏可能的原因之一在于用戶在動態分配一個內存空間之中,忘記將這部分內容手動釋放。例如:(c++之中使用new分配內存沒有使用delete釋放,或者c語言使用malloc分配內容沒有使用free釋放)

#include<iostream>
using namespace std;
int main(){
?? ?int* num=new int(10);
?? ?return 0;
}

這部分內容沒有對num進行delete內存釋放,導致內存泄漏。

需要注意的是內存泄漏并不是內存直接漏出去,而是指部分應該被回收的內存沒有被回收或者錯誤的被跳過導致沒有正確的回收,導致內存越來越多占據了大量的內存空間,可分配的內存越來越少,影響性能。

如何避免:

通過手動釋放這部分內容:

#include<iostream>
using namespace std;
int main(){
?? ?int* num=new int(10);
?? ?delete num;
?? ?return 0;
}

內存泄漏的原因二:沒有書寫析構函數,導致一部分動態分配的內存沒有被釋放或者析構函數被遺漏調用。例如基類的析構函數沒有被派生類重寫,導致當通過基類指針刪除派生類時,只調用了基類的析構函數,派生類本身的一部分動態分配的內存沒有被釋放,導致一部分內容沒有被正確的釋放,這是析構函數被遺漏時可能發生的情況。解決方法:添加析構函數或者在書寫成虛方法的析構函數對其進行方法重寫。

#include<iostream>
using namespace std;
class Test{
?? ?private:
?? ??? ?int* num;
?? ?public:
?? ??? ?Test(){
?? ??? ??? ?num=new int(10);
?? ??? ?}
?? ??? ?~Test(){
?? ??? ??? ?delete num;
?? ??? ?}
};
int main(){
?? ?Test test;
?? ?return 0;
}

原因三:使用的內存被循環的引用,導致引用計數始終不為0,例如使用智能指針shared_ptr,當兩個類相互的調用對方的智能指針時,引用計數始終不為0,這部分內容不會被正確的釋放。例如:

#include<iostream>
#include<memory>
using namespace std;
class B;
class A{
?? ?public:
?? ??? ?shared_ptr<B> b_ptr;
};
class B{
?? ?public:
?? ??? ?shared_ptr<A> a_ptr;
};
int main(){
?? ?shared_ptr<A> a=make_shared<A>();
?? ?shared_ptr<B> b=make_shared<B>();
?? ?a->b_ptr=b;
?? ?b->a_ptr=a;
?? ?return 0;
}

始終持有對方的智能指針的引用,引用計數始終不清零。

更改建議:可以使用weak_ptr打破循環引用:

例如:

#include<iostream>
#include<memory>
using namespace std;
class B;
class A{
?? ?public:
?? ??? ?shared_ptr<B> b_ptr;
};
class B{
?? ?public:
?? ??? ?weak_ptr<A> a_ptr;
};
int main(){
?? ?shared_ptr<A> a=make_shared<A>();
?? ?shared_ptr<B> b=make_shared<B>();
?? ?a->b_ptr=b;
?? ?b->a_ptr=weak_ptr<A>(a);
?? ?return 0;
}

原因四:程序雖然正確的書寫了delete對內容進行釋放,但是被異常拋出的錯誤跳過了內存釋放,導致內存釋放的部分被跳過,沒有正確的釋放這部分內存空間,舉例說明:

#include<iostream>
#include<stdexcept>
using namespace std;
void func(){
?? ?int* num=new int(10);
?? ?throw runtime_error("Exception");
?? ?delete num;
}
int main(){
?? ?try{
?? ??? ?func();
?? ?}
?? ?catch(const exception& error){
?? ??? ?cout<<error.what()<<endl;
?? ?}
?? ?return 0;
}

這部分由于拋出異常被跳過內存釋放,我們可以使用智能指針unique_ptr,使其在異常拋出之后自動的釋放這一部分內存,就不會發生這種異常,舉例說明:

#include<iostream>
#include<memory>
#include<stdexcept>
using namespace std;
void func(){
?? ?unique_ptr<int> u=make_unique<int>(10);
?? ?throw runtime_error("Exception");
}
int main(){
?? ?try{
?? ??? ?func();
?? ?}
?? ?catch(const exception& error){
?? ??? ?cout<<error.what()<<endl;
?? ?}
?? ?return 0;
}
?? ??? ?

原因5:資源管理對象的生命周期不當,沒有在正確的時機管理釋放內存。

老規矩,作為一名unity開發程序員,我們來思考C#之中存在哪一些內存泄漏(簡單說一下吧,之前在博客之中有詳細的描述)

C#之中如果事件訂閱未被取消也會導致內存泄漏,所以我們說事件的添加和移除應該是成雙成對出現的。另外一些使用lambda表達式的委托無法安全的移除,這時候盡量不要使用lambda表達式防止內存泄漏。另外一個靜態變量無法被內存回收,如果靜態變量引用了一些對象,這部分內容是無法被垃圾回收的。

C#相對于C++的內存泄漏問題比較少,這是由于C#的自動垃圾回收機制,會自動對一部分內存進行回收,大大降低了內存泄漏的風險,對于C++來說錯誤遺漏沒有進行delete釋放或者使用delete釋放之后又使用了已經被釋放的內容會出現懸空指針的問題。

C#的內存泄漏排查也相對于C++來說比較容易。不過,在使用非托管資源(如文件、網絡連接等)時,仍需要手動管理資源的釋放。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71851.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71851.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71851.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PDF處理控件Aspose.PDF,如何實現企業級PDF處理

PDF處理為何成為開發者的“隱形雷區”&#xff1f; “手動調整200頁PDF目錄耗時3天&#xff0c;掃描件文字識別錯誤導致數據混亂&#xff0c;跨平臺渲染格式崩壞引發客戶投訴……” 作為開發者&#xff0c;你是否也在為PDF處理的復雜細節消耗大量精力&#xff1f;Aspose.PDF憑…

工程化與框架系列(27)--前端音視頻處理

前端音視頻處理 &#x1f3a5; 引言 前端音視頻處理是現代Web應用中的重要組成部分&#xff0c;涉及音頻播放、視頻處理、流媒體傳輸等多個方面。本文將深入探討前端音視頻處理的關鍵技術和最佳實踐&#xff0c;幫助開發者構建高質量的多媒體應用。 音視頻技術概述 前端音視…

2008-2024年中國手機基站數據/中國移動通信基站數據

2008-2024年中國手機基站數據/中國移動通信基站數據 1、時間&#xff1a;2008-2024年 2、來源&#xff1a;OpenCelliD 3、指標&#xff1a;網絡類型、網絡代數、移動國家/地區、移動網絡代碼、區域代碼、小區標識、單元標識、坐標經度、坐標緯度、覆蓋范圍、測量樣本數、坐標…

阿里云 ESA 游戲行業解決方案|安全防護、加速、低延時的技術融合

如今&#xff0c;游戲行業正處于蓬勃發展與深刻變革的關鍵時期。根據中國國際數字娛樂產業大會&#xff08;CDEC&#xff09;發布的《2024年 1-6 月中國游戲產業報告》顯示 2024 年上半年國內游戲市場實際銷售收入達 1472.67 億元&#xff0c;同比增長 2.08%&#xff0c;游戲用…

C# Unity 唐老獅 No.7 模擬面試題

本文章不作任何商業用途 僅作學習與交流 安利唐老獅與其他老師合作的網站,內有大量免費資源和優質付費資源,我入門就是看唐老師的課程 打好堅實的基礎非常非常重要: 全部 - 游習堂 - 唐老獅創立的游戲開發在線學習平臺 - Powered By EduSoho 如果你發現了文章內特殊的字體格式,…

electron + vue3 + vite 主進程到渲染進程的單向通信

用示例講解下主進程到渲染進程的單向通信 初始版本項目結構可參考項目&#xff1a;https://github.com/ylpxzx/electron-forge-project/tree/init_project 主進程到渲染進程&#xff08;單向&#xff09; 以Electron官方文檔給出的”主進程主動觸發動作&#xff0c;發送內容給渲…

【雜談】-因果性:開啟機器學習新紀元?

文章目錄 因果性&#xff1a;開啟機器學習新紀元&#xff1f;一、機器學習的現狀與局限二、因果性的定義與意義&#xff08;一&#xff09;日常生活中的因果性案例&#xff08;二&#xff09;相關性與因果性的區別 三、現有機器學習模型的困境與因果性的價值&#xff08;一&…

【Python】omegaconf 用法詳解

OmegaConf&#xff1a;從基礎到進階 1. OmegaConf 簡介 OmegaConf 是 hydra 背后的核心配置庫&#xff0c;提供比 argparse 和 json.load 更靈活的配置管理能力。其主要特性包括&#xff1a; 安裝 OmegaConf&#xff1a; pip install omegaconf2. 基本操作 2.1 創建 OmegaC…

如何在 Windows 10 啟用卓越性能模式及不同電源計劃對比

在使用 powercfg -duplicatescheme 命令啟用 “卓越性能模式”&#xff08;即 Ultimate Performance 模式&#xff09;之前&#xff0c;有幾個前提條件需要注意&#xff1a; 前提條件&#xff1a; 系統版本要求&#xff1a;卓越性能模式 僅在 Windows 10 專業版 或更高版本&a…

請談談 HTTP 中的安全策略,如何防范常見的Web攻擊(如XSS、CSRF)?

一、Web安全核心防御機制 &#xff08;一&#xff09;XSS攻擊防御&#xff08;跨站腳本攻擊&#xff09; 1. 原理與分類 ?存儲型XSS&#xff1a;惡意腳本被持久化存儲在服務端&#xff08;如數據庫&#xff09;?反射型XSS&#xff1a;腳本通過URL參數或表單提交觸發執行?…

三、0-1搭建springboot+vue3前后端分離-idea新建springboot項目

一、ideal新建項目1 ideal新建項目2 至此父項目就創建好了&#xff0c;下面創建多模塊&#xff1a; 填好之后點擊create 不刪了&#xff0c;直接改包名&#xff0c;看自己喜歡 修改包名和啟動類名&#xff1a; 打開ServiceApplication啟動類&#xff0c;修改如下&#xff1a; …

從0到1入門RabbitMQ

一、同步調用 優勢&#xff1a;時效性強&#xff0c;等待到結果后才返回 缺點&#xff1a; 拓展性差性能下降級聯失敗問題 二、異步調用 優勢&#xff1a; 耦合度低&#xff0c;拓展性強異步調用&#xff0c;無需等待&#xff0c;性能好故障隔離&#xff0c;下游服務故障不影響…

二維碼識別OCR接口:開啟高效信息提取的新篇章

前言 在數字化時代&#xff0c;二維碼作為一種高效的信息傳遞工具&#xff0c;已經廣泛應用于各個領域。而二維碼識別OCR接口的出現&#xff0c;更是為企業和開發者提供了一種快速、準確地提取信息的解決方案。 技術原理&#xff1a;圖像識別與數據解析的完美結合 二維碼識別…

ThinkPHP框架

在電腦C磁盤中安裝composer 命令 在電腦的D盤中創建cd文件夾 切換磁盤 創建tp框架 創建一個aa的網站&#xff0c;更換路徑到上一步下載的tp框架路徑 在管理中修改路徑 下載壓縮包public和view 將前面代碼中的public和view文件替換 在PHPStom 中打開文件 運行指定路徑 修改demo…

Matlab:矩陣運算篇——矩陣數學運算

目錄 1.矩陣的加法運算 實例——驗證加法法則 實例——矩陣求和 實例——矩陣求差 2.矩陣的乘法運算 1.數乘運算 2.乘運算 3.點乘運算 實例——矩陣乘法運算 3.矩陣的除法運算 1.左除運算 實例——驗證矩陣的除法 2.右除運算 實例——矩陣的除法 ヾ(&#xffe3;…

快速從C過度C++(一):namespace,C++的輸入和輸出,缺省參數,函數重載

&#x1f4dd;前言&#xff1a; 本文章適合有一定C語言編程基礎的讀者瀏覽&#xff0c;主要介紹從C語言到C過度&#xff0c;我們首先要掌握的一些基礎知識&#xff0c;以便于我們快速進入C的學習&#xff0c;為后面的學習打下基礎。 這篇文章的主要內容有&#xff1a; 1&#x…

C語言 進階指針學習筆記

文章目錄 字符指針指針數組數組指針數組名數組傳參 函數指針函數指針數組指向函數指針數組的指針 回調函數Qsort 的使用通過冒泡排序模擬實現 qsort 大部分的內容都寫在代碼注釋中 指針有類型&#xff0c;指針的類型決定了指針的整數的步長&#xff0c;指針解引用操作的時候的權…

李沐《動手學深度學習》——14.9. 用于預訓練BERT的數據集——wiki數據集問題以及存在的其他問題

問題1&#xff1a;出現"file is not a zip file" 原因是鏈接已經失效。 解決方法&#xff1a;打開下面鏈接自行下載&#xff0c;需要魔法。下載完解壓到特定位置。 下載鏈接&#xff1a;項目首頁 - Wikitext-2-v1數據包下載:Wikitext-2-v1 數據包下載本倉庫提供了一…

【芯片驗證】verificationguide上的36道UVM面試題

跟上一篇一樣,verificationguide上的36到UVM面試題,通義回答ds判卷。 1. What is uvm_transaction, uvm_seq_item, uvm_object, uvm_component? uvm_transaction、uvm_seq_item、uvm_object、uvm_component是什么? uvm_transaction是UVM中所有事務的基礎類,用于表示仿真…