释放char数组时内存泄漏

Memory Leak when freeing a char array

本文关键字:内存 泄漏 数组 char 释放      更新时间:2023-10-16

我有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] = '';

在这种情况下,arr只有无效的长度50,而不是100然后我使用免费:

free(arr);

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

free知道分配的内存块的大小。嗯,它怎么知道尺寸?这取决于实现,但通常它会在分配的实际内存块开始之前存储大小。例如,在Coliru上,下面的程序打印113(113意味着它分配的内存比我们实际要求的要多)。

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

这已经过时了,但阅读《内存分配器》可能是个好主意。它将让您了解哪些方面做得更好(请记住,实际实现可能存在差异)。

否。存储器的内容对CCD_ 3的工作方式没有影响。

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

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