2012-02-29 71 views
0

如果一個進程正在執行一次並且正在連續運行,而在該進程中只能動態分配內存,則我們可以說內存正在泄漏內存:一次未使用free()函數釋放呼叫。 基本上,該變量的內存分配在進程源代碼的進入過程中,並且在初始化進程時稱爲一次關於查找正在運行的進程中的內存泄漏

這裏是過程

void caoamKeycodeInit(int *cesFd,int *sosFd,int *dcnFd,unsigned short gId,unsigned short suId,unsigned short sosSuId) 
{ 
keycodeApiManager *caoamKeyApiInstance; 
caoamKeyApiInstance = (keycodeApiManager*)malloc(sizeof(keycodeApiManager)); 

/*********rest of the proc code *****/ 

} 

這裏的存儲器被分配給caoamKeyApiInstance指針變量是類型caoamKeyApiInstance其是結構變量的示例代碼段。 將欣賞你的投入。

回答

0

你應該之間的區別失去仍可達動態分配(很像Valgrind的一樣):如果沒有其他指向動態內存中存在,那麼該內存失去,這應該被認爲是編程錯誤,不管這是在一個循環中,還是在增長,或者只是一個關閉。

在另一方面,如果您分配一個對全局資源,不清除它們,那麼這些僅僅是仍可達:您可能免費的,如果你想要的,只是你不煩。這是一個不同的問題,雖然它可能不是非常優雅(並且調試模糊),但它也不是世界末日。

下面是一個例子:

void * p, * q = malloc(100); 

for (int i = 0; i != 10; ++i) 
{ 
    p = malloc(15); 
} 

在這種情況下,在q內存仍然可以到達,你可以在結束與free(q);釋放它。另一方面,循環中有十分之九的分配是丟失,你永遠無法恢復它們。

下面介紹如何設計一些類似於循環的安全方法:使指針始終爲NULL或有效的約定。

void * p = 0; 

void free_it(void ** q) { free(*q); *q = NULL; } 

void make_something(void *q) 
{ 
    free_it(q); 
    if (some_condition()) { q = malloc(100); } 
} 

int main() 
{ 
    p = malloc(25); 
    // ... 
    make_something(p); 
    // ... 
    free_it(p); 
    // ... 
} 

基本上,無論你目前正在拿着動態內存與否,p總是準確地反映狀態,任何時候你想要分配新的東西,你可以安全地釋放先前的指針值,因爲它是要麼有效,需要被釋放或爲空。

+0

仍然不清楚......實際上內存繼續被分配給在進程初始化期間完成但尚未釋放的變量..可能涉及內存泄漏,我想澄清...... – cbinder 2012-03-02 09:43:36