1. 程式人生 > >C++造成記憶體洩漏的原因彙總:

C++造成記憶體洩漏的原因彙總:

對於C++的記憶體洩漏,總結一句話:就是new出來的記憶體沒有通過delete合理的釋放掉!

一、程式迴圈new創建出來的物件沒有及時的delete掉,導致了記憶體的洩露;
程式碼如下:

#include <iostream>
#include <new.h>

using namespace std;

void out_of_memroy()
{
    cout << "ERROR:記憶體已耗盡!" << endl;
}

int main()
{
    set_new_handler(out_of_memroy);//注意引數傳遞的是函式的地址;
while(1) { new int[1000]; } return 0; }

以上程式碼會在堆區瘋狂的動態分配記憶體空間,導致系統記憶體耗盡時自動呼叫set_new_handler引數列表中的函式,打印出ERROR:記憶體已耗盡!如下圖:
這裡寫圖片描述

二、delete掉一個void*型別的指標,導致沒有呼叫到物件的解構函式,析構的所有清理工作都沒有去執行從而導致記憶體的洩露;
程式碼如下:

class Object {
private:
    void* data;
    const int size;
    const char id;
public
: Object(int sz, char c):size(sz), id(c){ data = new char[size]; cout << "Object() " << id << " size = " << size << endl; } ~Object(){ cout << "~Object() " << id << endl; delete []data; } };

緊接著使我們的main函式:

int main() {
Object
* a = new Object(10, 'A');//Object*指標指向一個Object物件; void* b = new Object(20, 'B');//void*指標指向一個Object物件; delete a;//執行delete,編譯器自動呼叫解構函式; delete b;//執行delete,編譯器不會呼叫解構函式,導致data佔用記憶體沒有得到回收; cout << "Press any key to continue... ..." << endl; getchar(); return 0; }

執行結果如下圖:
這裡寫圖片描述
從執行結果看到,並沒有執行b指標(void*)所指物件的解構函式,所以delete一個void*的指標可能會造成記憶體上的洩露!

三、new建立了一組物件陣列,記憶體回收的時候卻只調用了delete而非delete []來處理,導致只有物件陣列的第一個物件的解構函式得到執行並回收了記憶體佔用,陣列的其他物件所佔記憶體得不到回收,導致記憶體洩露;
程式碼如下:

class Object1
{
    int a;
    int b;
};

int main() {
Object1* arry1 = new Object1[100];//建立包含100個Object1的物件陣列arry1並返回陣列首地址;
Object1* arry2 = new Object1[100];//建立包含100個Object1的物件陣列arry2並返回陣列首地址;
delete []arry1;//回收了陣列arry1裡的所有物件動態建立時佔用的記憶體空間;
delete  arry2;//回收了陣列arry2裡的第一個物件動態建立時佔用的記憶體空間,導致其他99個物件的記憶體空間洩露;

cout << "Press any key to continue... ..." << endl;
getchar();
return 0;
}

四、未完待續… … ——Powered By Anonymous–V.