2013-07-02 65 views
2

當我有malloc的字符數組和初始化:內存泄漏釋放字符數組

int i; 
int length = 100; 
char *arr = (char *) malloc (length * sizeof(char)); 
for (i = 0; i < length; i++) { 
    arr[i] = i; 
} 

然後我中間炭設置爲「\ 0」:

arr[50] = '\0'; 

在這種情況下, ARR只有無效長度爲50,而不是100 然後我用免費:

free(arr); 

可這導致內存泄漏?即操作系統會記錄malloc長度還是隻使用strlen來判斷長度?

回答

1

不,內存的內容對free()的工作方式沒有影響。

free()不知道你是用這個作爲空終止的字符串。它絕不會在內存塊上使用strlen()

嘗試使用像valgrind這樣的工具來檢查代碼是否泄漏。

2

free知道分配的內存塊的大小。那麼,它是如何知道尺寸的?這是依賴於實現的,但通常它會在分配的實際內存塊開始之前存儲該大小。例如,在Coliru上,下面的程序打印113(113表示它分配的內存比我們實際要求的多)。

#include <iostream> 

int main() 
{ 
char *arr = (char *) malloc (100 * sizeof(char)); 
std::cout << *((std::size_t*)arr - 1) << std::endl; 
} 

這是很過時,但在閱讀A Memory Allocator可能是一個好主意。它會給你一個更好的想法(只要記住可能與實際實施有所不同)。

+0

「可能與實際執行有差異」 - 是的。特別是因爲你的例子正式導致一個未定義的行爲。 –