1. 程式人生 > >作業系統--記憶體洩漏相關

作業系統--記憶體洩漏相關

程式中通常包含著靜態記憶體和棧記憶體

靜態記憶體用來儲存區域性static物件、類static資料成員以及定義在任何函式之外的變數(全域性變數)。

棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷燬。對於棧物件,僅在定義的程式塊執行時才存在,程式退出,棧物件也隨即銷燬;static物件和全域性物件則是在程式結束時銷燬。

在使用堆空間是就需要使用動態記憶體分配

記憶體洩漏:是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。

1.   記憶體洩漏出現的情況總結

首先總結一下c++在語法上的錯誤使用導致的記憶體洩漏,所以在編寫程式時,就儘量避免錯誤的編寫。

 (1)正確的使用new和delete函式,需要注意的是new和delete要匹配使用,對於初學者這種情況是最常出現的。一般出錯的地方像如下的例子,在指標p的值被另一個函式所使用。

  1. char * FunA()  
  2. {  
  3.     char *p = new char;  
  4.     return p;  
  5. }  
  6. void FunErrorB()  
  7. {  
  8.     char *b = FunA();  
  9.     //忘記delete p      

  (2)釋放物件陣列時,沒有使用delete[]。如例子所示:

  1. Void FunErrorA()  
  2. {  
  3.     Char *p = new char[10];  
  4.     Delete p;  
  5. }  

  (3)雙指標釋放錯誤,存在指標釋放的遺漏。如例子正確的釋放一個雙指標

  1. Void FunRightA()  
  2. {  
  3.     Char **p = new char*[10];  
  4.     For(int i=0;i<10;i++)  
  5.     {  
  6.         p[i] = new char[10];  
  7.     }  
  8.     If(p!=nullptr)  
  9.     {  
  10.         For(int i=0;i<10;i++)  
  11.         {   Delete []p[i];  
  12.             p[i] = nullptr;  
  13.         }  
  14.         Delete []p;  
  15.         p = nullptr;  
  16.     }  
  17. }  

(4)缺少拷貝建構函式。在類裡存在成員變數是指標時,在進行賦值=運算和按值傳參時,必須過載拷貝建構函式,重新實現其指標拷貝的部分.

(5)沒有將基類的解構函式定義為虛擬函式。當基類指標指向子類物件時,如果基類的解構函式不是virtual,那麼子類的解構函式將不會被呼叫,子類的資源沒有正確是釋放,因此造成記憶體洩露。

(6)呼叫庫存在記憶體洩漏。在使用由個人包裝或者未完全測試的庫時,要確定此庫對本程式不存在效能的影響。

相關推薦

作業系統--記憶體洩漏相關

程式中通常包含著靜態記憶體和棧記憶體。 靜態記憶體用來儲存區域性static物件、類static資料成員以及定義在任何函式之外的變數(全域性變數)。 棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷燬。對於棧物件,僅在定義

VueJS SSR 後端繪製記憶體洩漏相關解決經驗

引言 Memory Leak 是最難排查除錯的 Bug 種類之一,因為記憶體洩漏是個 undecidable problem,只有開發者才能明確一塊記憶體是不是需要被回收。再加上記憶體洩漏也沒有特定的報錯資訊,只能通過一定時間段的日誌來判斷是否存在記憶體洩漏。大家熟悉的常用除錯工具對排查記憶體洩漏也沒有用武

【C語言】malloc()和free()函式的講解以及相關記憶體洩漏問題

1、函式原型及說明: void *malloc(long NumBytes):該函式分配了NumBytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回一個空指標(NULL)。 關於分配失敗的原因,應該有多種,比如說空間不足就是一種。 void free(void *FirstByte): 該

GitHub相關android記憶體洩漏

Activity的洩漏是記憶體洩漏裡面最嚴重的問題,它佔用的記憶體多,影響面廣 a.內部類引用導致Activity的洩漏。(學習未注意知識點:非靜態內部類 和 匿名類 都會潛在的引用它們所屬的外部類。但是,靜態內部類卻不會。) public class SampleActivity extends A

[Android]Android記憶體洩漏你所要知道的一切(翻譯)

以下內容為原創,歡迎轉載,轉載請註明 來自天天部落格:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android記憶體洩漏你所要知道的一切 原文:https://blog.aritraroy.in/everything-

Vc 檢測記憶體洩漏

https://docs.microsoft.com/zh-cn/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2017   啟用記憶體洩漏檢測 檢測記憶體洩漏是 C/c + + 偵錯程式和 C

記憶體洩漏檢測分析工具

monkey 工具測試應用 可以使用monkey自動化測試工具快速不斷的操作應用。終端指令: // 300 毫秒一個事件,2000個事件,跑10分鐘 adb shell monkey -p com.android.deskclock -v --throttle 300 --ign

[轉]Android 如何有效的解決記憶體洩漏的問題 Android 如何有效的解決記憶體洩漏的問題

Android 如何有效的解決記憶體洩漏的問題   前言:最近在研究Handler的知識,其中涉及到一個問題,如何避免Handler帶來的記憶體溢位問題。在網上找了很多資料,有很多都是互相抄的,沒有實際的作用。 本文的記憶體洩漏檢測工具是:LeakCanary &nbs

關於記憶體溢位和記憶體洩漏的討論

什麼是記憶體洩漏? 程式的執行需要記憶體。只要程式提出要求,作業系統或者執行時(runtime)就必須供給記憶體。 不再用到的記憶體,沒有及時釋放,就叫做記憶體洩漏(memory leak),對於持續執行的服務程序(daemon),必須及時釋放不再用到的記憶體。否則,記

threadlocal與ThreadPoolExecutor造成的記憶體洩漏

threadlocal與執行緒相關,每個執行緒都會有一份,參考  http://python.jobbole.com/86150/ ThreadPoolExecutor建構函式裡面有max_workers引數,如果這個引數設定的不好,就有可能造成記憶體洩漏。 示例程式碼如

單例模式引起的記憶體洩漏

單例模式是我們專案中經常使用的一個設計模式,但是如果使用不當,也會引發記憶體洩漏。 例如: 下面這種常見的寫法,傳了一個Context 進去 import android.content.Context; public class Utils { private Context

Java基礎---bat 克隆 記憶體洩漏

package cn.itcast.bat; /* bat處理檔案: bat處理檔案就是可以一次性執行多個命令的檔案。 為什麼要學bat處理檔案, 快速執行一個軟體我一般都會把軟體打包一個jar包。 jar雙擊可以執行僅對於圖形化介面的軟體起作用,對於控制檯的

記憶體溢位和記憶體洩漏的區別、產生原因以及解決方案【轉】

(轉自:https://www.cnblogs.com/Sharley/p/5285045.html) 記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就

深入剖析Qt記憶體洩漏(總結)

一、簡介 Qt記憶體管理機制:Qt 在內部能夠維護物件的層次結構。對於可視元素,這種層次結構就是子元件與父元件的關係;對於非可視元素,則是一個物件與另一個物件的從屬關係。在 Qt 中,在 Qt 中,刪除父物件會將其子物件一起刪除。 C++中delete 和 new 必須配對使用(一 一對

Visual Studio中檢測記憶體洩漏的方法

Visual Studio中檢測記憶體洩漏的方法 #include <iostream> //可以定位到發生記憶體洩露 所在的檔案和具體那一行,用於檢測 malloc 分配的記憶體 #define _CRTDBG_MAP_ALLOC #include <s

android 使用handle警告,,存在記憶體洩漏的危險,使用靜態內部類和弱引用的方式解決。

Handle警告的原因:handle定義為內部類,會持有外部類的引用,如果外部類結束,handle因為執行耗時操作沒有結束,並持有外部類的引用,導致外部類佔用的記憶體不能釋放。 解決辦法:handle定義為靜態內部類,handle對於外部類的元件和方法的操作藉助弱引用來實現。 public

GDI+ RectF記憶體洩漏問題

      近期用GDI+來畫圖,其貼圖的方式畫出來的圖效果很好,特別對重新整理問題特別有效。但卻似莫名其妙到處有記憶體洩漏,而且很有規律都是16bytes,如下圖所示。而本程式中程式碼並沒有new出記憶體,難道是GDI+的問題?但GDI+不是不用關注畫圖資源的釋放嗎,

關於C++記憶體洩漏的一個經驗教訓

       近期寫了一段程式碼,發現有記憶體洩漏,經多次查詢都找不到源點,搞到焦頭爛額,最後經同事細心審查,競是粗心導致的隱藏性錯誤,為了在以後避免犯同樣的錯誤,有必有記錄下來。        在C++中記憶體管理

JVM 記憶體洩漏

先挖個坑放著,暫時沒時間寫。 前言   記憶體洩漏(Memory Leak)是指程式中己動態分配的堆記憶體由於疏忽或者是錯誤造成程式未能釋放已經不再使用的記憶體的情況。   記憶體洩漏指的是由應用程式分配某段記憶體後,由於設計的錯誤,失去了對該記憶體的控制,因此

LeakCanary Android 記憶體洩漏分析利器 原始碼編譯配置mk檔案

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := \ $(call all-java-files-under, src) LOCAL_SRC_