2

我有 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);

这会导致内存泄漏吗?ie操作系统会记录malloc长度还是只用strlen判断长度?

4

2 回答 2

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可能是个好主意。它将让您更好地了解正在发生的事情(请记住,实际实现可能存在差异)。

于 2013-07-02T03:58:22.990 回答
1

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

free()不知道您将其用作以空字符结尾的字符字符串。它永远不会strlen()在一块内存上使用。

尝试使用 valgrind 之类的工具来检查您的代码是否存在泄漏。

于 2013-07-02T03:51:07.330 回答