2013-07-02 67 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

“可能与实际执行有差异” - 是的。特别是因为你的例子正式导致一个未定义的行为。 –