关于0字节的内存泄露 与 0字节的内存申请

原创 2011年01月17日 11:36:00

今天继续看内核,发现有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的内存

方法1:char *a;a=(char*)malloc(100*sizeof(char));if(a==NULL){printf("Out of memorr!");exit(1);}memset(a...

关于用malloc函数申请0字节内存的进一步讨论——《C语言深度解剖》笔记

环境:vs2008 关于malloc和free:      malloc两次,free一次会内存泄漏,当时无现象,但机子会越来越慢;malloc一次、free两次肯定会出错。如下: ...
  • fovwin
  • fovwin
  • 2012年11月11日 12:43
  • 3231

Android 从java字节码告诉你 为什么Handler会造成内存泄露

http://www.cnblogs.com/punkisnotdead/p/4943260.html 很多人面试的时候,都知道Handler 极易造成内存泄露,但是有一些讲不出...

使用EXIT(0) 直接退出后,出现内存泄露情况

使用EXIT(0) 退出程序时,跳出以下内存泄露信息: Detected memory leaks! Dumping objects -> f:\sp\vctools\vc7libs\s...

Android内存泄露---检测工具篇_0

内存使用是程序开发无法回避的一个问题。如果我们毫不在意肆意使用,总有一天会为此还账,且痛不欲生...所以应当防患于未然,把内存使用细化到平时的每一行代码中。 内存使用概念较大,本篇先讲对已有app如...

Ubuntu提示卷boot仅剩0字节的硬盘空间,解决办法

安装Ubuntu系统之后,当时boot分区是200M,经过系统升级之后,之前的LInux内核依然会存在boot分区中,直接是造成boot分区提示硬盘不足的原因,此时我们可以删除之前的linux内核,仅...
  • hnzcdy
  • hnzcdy
  • 2016年08月31日 09:50
  • 5100

c++内存中字节对齐问题详解

  • 2013年03月02日 19:34
  • 32KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于0字节的内存泄露 与 0字节的内存申请
举报原因:
原因补充:

(最多只允许输入30个字)