在編寫嵌入式**的時候,由於在全入市,有時候比較的注意記憶體資源的使用。在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...