我有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来判断长度?
答案 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这样的工具来检查代码是否泄漏。