乙個簡單的記憶體檢查系統

2021-05-28 12:49:43 字數 2366 閱讀 5710

在編寫嵌入式**的時候,由於在全入市,有時候比較的注意記憶體資源的使用。在inux環境下,我使用了下面的較為簡單的記憶體檢查系統。

具體不多說了,思想比較的簡單,就是記錄下每次new分配資源的時候,記錄下相關的資訊,然後在呼叫delete釋放資源的時候,

找到分配的時候對應的記錄,將其刪除。如果最後,每次new時記錄的資訊,都在delete的時候被刪除了,那麼就認為沒有記憶體洩露。

如果,到最後程式執行完時候,還有一些呼叫new時分配的存放的記錄還沒有被刪除,那麼就認為出現了記憶體洩露。並將分配資源卻沒有

被釋放的那塊記憶體位址和分配記憶體時的檔案和**位置,方便我們進行除錯。

標頭檔案:

#ifndef memcheck_h

#define memcheck_h

#include // for size_t

// use the new operator (both scalar and array versions)

void* operator new(size_t, const char*, long);

void* operator new(size_t, const char*, long);

#define  new new (__file__, __line__)

extern bool traceflag;

#define  trace_on()  traceflag = true

#define  trace_off() traceflag = false

extern bool activeflag; 

#define  mem_on()  activeflag = true

#define  mem_off() activeflag = false

#endif

原始檔:

#include

#include

#include

#include

#undef new

//global flags set by macros in memcheck.h

bool traceflag = true;

bool activeflag = false;

namespace

;//memory map data

const size_t maxptrs  = 10000u;

info memmap[maxptrs];

size_t nptrs = 0;

//searches the map for an address

int findptr(void *p)

void delptr(void* p)

--nptrs;

}//dummy type for static destructor 

struct sentinel

~sentinel()

}else

printf("no user memory leaks!\n");}};

// static dummy object

sentinel s;

}// end of anonymous namespace

// overload scalar new

void* operator new(size_t siz, const char* file, long line)

memmap[nptrs].ptr = p;

memmap[nptrs].file = file;

memmap[nptrs].line = line;

++nptrs;

}if (traceflag)

return p;

}//overload array new

void* operator new(size_t siz, const char* file, long line)

//override scalar delete 

void operator delete(void* p)

}else if(!p && activeflag)

printf("attempt to delete unknown pointer: %p\n", p);

}//override array delete 

void operator delete(void *p)

簡單實用示例:

#include "stdafx.h"

#include

#include

#include

using namespace std;

#include "memcheck.h"

class foo

~foo()

};void main(void)

乙個簡單的記憶體池

為什仫要使用記憶體池?1.通常我們用new delete和malloc free來管理記憶體,可能會需要頻繁的呼叫記憶體,減少執行時間,增加效率.2.避免記憶體碎片 傳統的new delete的弊端 1.分配記憶體時要檢視空閒分割槽表,根據一定的演算法來分配,比如最佳適應演算法,最差適應演算法.然後...

乙個簡單的記憶體池

記憶體池是我們經常使用的一種池,常見的池還有程序池 執行緒池和連線池,今天我們就先討論記憶體池。首先看一下池的定義 池 池就是在初始時,申請比剛開始要使用的資源大的多的資源空間,接下來使用時,直接從池中獲取資源。記憶體池 即在初始時申請分配一定數量的。大小相等的記憶體塊留作備用,此後如有需要直接從該...

LINUX檢查乙個程序記憶體增長的指令碼

記憶體洩露很難查。記憶體有沒有洩露?內存在 洩露?ps a grep awk get pid then pid 0 echo return 0 fi 得到程序號之後的空格 pos expr index text pos expr pos 1 擷取程序號 pid echo text cut c 1 p...