c - 为什么 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 上分配内存,以及决定分配多少内存的逻辑是什么?
解决方案
malloc(0)
返回一个新的有效地址,因为这是它在 C 标准允许的选项中选择的选项。
7.22.3 内存管理功能(强调我的)
1连续调用aligned_alloc、calloc、malloc 和realloc 函数分配的存储顺序和连续性未指定。如果分配成功,则返回的指针经过适当对齐,以便可以将其分配给具有基本对齐要求的任何类型对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式释放)。已分配对象的生命周期从分配一直延伸到解除分配。每个这样的分配都将产生一个指向与任何其他对象不相交的对象的指针。返回的指针指向分配空间的开始(最低字节地址)。如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就好像大小是某个非零值,但返回的指针不应用于访问对象.
windows 上的实现选择第二种行为。因此它必须进行一些分配以确保需求立即出现。分配函数返回的每个有效指针必须与分配函数返回的任何其他指针不相交。
相关阅读:
推荐阅读
- back - 如何使用指向同一页面的后退按钮创建链接?
- typescript - 打字稿中 ID 的扩展类型不接收 ID 属性
- apache - Apache 重写日志
- javascript - SWR 大小,setSize 在 SWRResponse 类型上不存在
? - vue.js - Laravel 和 VueJS 的 ID 动态菜单
- javascript - 如何在 JavaScript 中根据数组值返回对象值
- android - 如何保持网页视图全屏
- jsf - 在 jsf 中的 mouseon 事件后动态显示工具提示
- html - Visual Studio Code 没有颜色或代码建议
- reactjs - 如何获取 react-bootstrap 道具的类型