首页 > 解决方案 > 为什么 malloc(0) 在 Windows 上会导致严重的内存泄漏?

问题描述

我刚刚结束了愉快的 4.5 小时调试系统中令人讨厌的泄漏。

原来我是这样做的:

params = allocate(sizeof(Something*) * num_params); 

依次调用malloc传入的第一个参数。当num_params为 0 时,它将调用malloc(0).

在循环中运行它,程序将很快占用大部分内存。我通过首先检查 if 来修复它,如果是num_params == 0,则避免调用allocate.

我知道标准规定malloc(0)是实现定义的。那么,这是如何在 Windows 7 C 运行时库中实现的,为什么会导致泄漏?

编辑:澄清问题 - 为什么malloc(0)在 Windows 上分配内存,以及决定分配多少内存的逻辑是什么?

标签: cwindowsmemory-leaks

解决方案


malloc(0)返回一个新的有效地址,因为这是它在 C 标准允许的选项中选择的选项。

7.22.3 内存管理功能(强调我的)

1连续调用aligned_alloc、calloc、malloc 和realloc 函数分配的存储顺序和连续性未指定。如果分配成功,则返回的指针经过适当对齐,以便可以将其分配给具有基本对齐要求的任何类型对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式释放)。已分配对象的生命周期从分配一直延伸到解除分配。每个这样的分配都将产生一个指向与任何其他对象不相交的对象的指针。返回的指针指向分配空间的开始(最低字节地址)。如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就好像大小是某个非零值,但返回的指针不应用于访问对象.

windows 上的实现选择第二种行为。因此它必须进行一些分配以确保需求立即出现。分配函数返回的每个有效指针必须与分配函数返回的任何其他指针不相交。


相关阅读:


推荐阅读