关于0字节的内存泄露 与 0字节的内存申请
来源:互联网 发布:数据库处理 编辑:程序博客网 时间:2024/06/05 14:27
今天继续看内核,发现有0字节的内存分配,觉得有点奇怪.自己写了一个测试程序.
void CTestDlg::OnOK()
{
char *p = (char*)malloc(0);
free(p);
}
发现居然是可以通过编译的,且分配的指针p有效.看了一下MSDN的malloc的描述:
If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item.
既然用户传0,malloc还分配一个有效内存地址,那这地址一定是内存控制块了.内存控制块应该是一段size很小的空间,起个运行时校验作用,由校验数据和校验码组成,这是个人推断了,MSDN上未有内存控制块的组成说明.下面我们会以代码验证这个推断.
char *p = (char*)malloc(0);
*p = 100;//改写了控制块的内存
return;//不释放
不释放自然不会有运行时库的堆检查了.但这种作法产生了0字节的内存泄露.
Detected memory leaks!
Dumping objects ->
{80} normal block at 0x00382FB8, 0 bytes long.
Data: <>
Object dump complete.
CSDN上有人曾有这种疑惑,但是未有人正确解答.见如下帖.
http://topic.csdn.net/u/20090310/20/0489b016-6425-4b15-a093-ea67cf75e15f.html
甚至有人说C++不允许new出0字节内存,我也试了一下,发现new0字节是可以的.
char *p = new char[0];
加上释放代码:
char *p = (char*)malloc(0);
*p = 100;//改写了控制块的内存
free(p);
return;
结果断言错误.
DAMAGE:after Normal block(#88) at 0x00382FB2
能看到的代码在crt/src/dbgheap.c 1178行 free调用_free_dbg函数。实现的代码看不到了。
原因是损坏了内存控制块。
改成如下方式:
char *p = (char*)malloc(0);
int a = *p; //保存块数据
//其它操作代码
*p = a;//释放前还原控制块
free(p);
return;
执行并退出程序,可以看到一切正常了。
最后回到内核代码8390.h alloc_eip_netdev(void)调用__alloc_eip_netdev(0);
struct net_device *__alloc_eip_netdev(int size)
{
struct net_device *dev = __alloc_ei_netdev(size);
if(dev)
dev->netdev_ops = &eip_netdev_ops;
return dev;
}
可以看到内核分配了0字节而且改写了。但为什么没出问题呢?
只有继续研究,等弄通后再在下一篇来解决这个疑惑了.
- 关于0字节的内存泄露 与 0字节的内存申请
- 关于用malloc函数申请0字节内存的进一步讨论——《C语言深度解剖》笔记
- 关于内存字节对齐的例子
- 关于字节内存对齐
- 关于内存字节对齐
- malloc函数申请0字节的问题
- 内存分配的字节对齐
- C++ 内存的字节对齐
- 关于内存字节大小的测试,用sizeof();
- 关于C++内存中字节对齐问题的详细介绍
- 关于C++内存中字节对齐问题的详细介绍
- 关于C++内存中字节对齐问题的详细介绍
- 关于IMAGE_OPTIONAL_HEADER.SectionAlignment与IMAGE_OPTIONAL_HEADER.FileAlignment 以及内存映射的字节对齐
- 基于N字节对齐的内存分配与归还
- 关于内存申请的问题
- 关于java的内存泄露
- 关于内存泄露的检查
- 关于java的内存泄露
- 数学是成就卓越开发人员的必备技能
- Makefile Kconfig 内核配置 内核裁剪
- More Effective C++:避免缺省构造函数
- NAS DIY的设计和实施过程-6-打造属于我的NAS操作系统
- 透明层--遮罩层
- 关于0字节的内存泄露 与 0字节的内存申请
- {{store direct_url="about-us"}} ----------static block块中的书写!-=--------------magento
- 在FreeBSD上安装VMware-Tools
- urlencode 函数
- android中通过代码实现文件权限修改(chmod)
- 使用ASP.NET 2.0 Profile存储用户信息[翻译] Level 200
- 我的技术博客落户啦!!!
- android的binder机制研究(C++部分)
- windows 7 内核程序开发一之开发环境