释放char数组时内存泄漏

时间:2013-07-02 03:46:37

标签: c++ memory

我有malloc一个char数组并初始化它:

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来判断长度?

2 个答案:

答案 0 :(得分: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可能是一个好主意。它会让你了解更好的情况(请记住,实际的实现可能存在差异)。

答案 1 :(得分:1)

没有。内存的内容对free()的工作方式没有影响。

free()不知道您使用此作为空终止字符串。它永远不会在一块内存上使用strlen()

尝试使用像valgrind这样的工具来检查代码是否泄漏。