記憶體流失(記憶體洩漏) 問題

記憶體流失(記憶體洩漏) 問題

記憶體流失(記憶體洩漏)[Memory leak] 問題


資料來源: https://zh.wikipedia.org/zh-tw/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F


    記憶體流失(Memory leak)是在電腦科學中,由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體。記憶體流失並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。


    記憶體流失通常情況下只能由獲得程式原始碼的程式設計師才能分析出來。


EX:

01.C code:

    下面是一個C語言的例子,在函式f()中申請了記憶體卻沒有釋放,導致記憶體流失。當程式不停地重複呼叫這個有問題的函式f,申請記憶體函式malloc()最後會在程式沒有更多可用記憶體可以申請時產生錯誤(函式輸出為NULL)。但是,由於函式malloc()輸出的結果沒有加以出錯處理,因此程式會不停地嘗試申請記憶體,並且在系統有新的空閒記憶體時,被該程式占用。注意,malloc()返回NULL的原因不一定是因為前述的沒有更多可用記憶體可以申請,也可能是邏輯位址空間耗盡,在Linux環境上測試的時候後者更容易發生。

 #include <stdio.h>
 #include <stdlib.h>

 void f(void)
 {
     void* s;
     s = malloc(50); /* 申请内存空间 */
     return;  /* 内在泄漏 - 参见以下资料 */ 
     /* 
      * s 指向新分配的堆空间。
      * 当此函数返回,离开局部变量s的作用域后将无法得知s的值,
      * 分配的内存空间不能被释放。
      *
      * 如要「修复」这个问题,必须想办法释放分配的堆空间,
      * 也可以用alloca(3)代替malloc(3)。
      * (注意:alloca(3)既不是ANSI函数也不是POSIX函数)
      */
 }
 int main(void)
 {
     /* 该函数是一个死循环函数 */
     while (true) f(); /* Malloc函数迟早会由于内存泄漏而返回NULL*/
     return 0;
 }


02.C++ code:

    以下例子中,儲存了整數123的記憶體空間不能被刪除,因為位址丟失了。這些空間已無法再使用。

#include <iostream>
using namespace std;
int main()
{ 
   int *a = new int(123);
   cout << *a << endl;
   // We should write "delete a;" here
   a = new int(456);
   cout << *a << endl;
   delete a;
   return 0;
}

One thought on “記憶體流失(記憶體洩漏) 問題

  1. C/C++在動態配置記憶體 操作不當衍生BUG

    最常見的就是線上遊戲主機 定期要維修(其實大都都是將設備重開機[Reset/Reboot])

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *