从free(p)到delete[]p

原创 2001年10月30日 11:15:00

  曾经有一个朋友提过这样一个问题,malloc动态分配的内存的生存周期是多少??当时直接回答,当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题,free调用之前那段范围内,free只有一个指针参数,它是如何知道要释放多少空间呢??比如:

int*pInt=(int*)malloc(10*sizeof(int));

…….;

free(p);

这里free是如何知道释放10int大小的空间呢??既然free只需要一个参数指针类型,那么这个地址(malloc返回的)一定作过什么特殊处理了.于是我问了一些网上的朋友,我得出以下一些结果:

   char*p=malloc(size):

                 1. 实际分配一块size + 4大小的内存,char *p = 内存首地址。
                 2. *((int *)p) = size;  //
把大小放在分配内存的起始处。
                 3. return (void*)(p + 4);  //
返回除去存放大小以后的部分。

   free(p);   1. char* q = (char *)p - 4;
                 2. int size = *((int *)q); //
这里找到了size...
                 3.
通过操作系统释放内存或自己管理C/C++堆内存.

这里要涉及到一些OS管理内存得问题,非我力所能及,但我们可以知道,malloc确实实施了一些特殊的处理.言归正传.让我们看看下面一段c++代码:

   int*p=new int[10];

   delete []p;

一眼就看出上面得代码完成的和上面的c代码一样的功能.这里有同样的问题,为什么delete

能在不指定动态分配的数组size下就能释放所分配的对象呢,是不是new操作也对返回的地址作了一些手脚???答案:.new所作的处理和上面的方法一样的,:new所传回的每一个内存区域配置一个额外的DWORD,然后把元素数目包藏到那个DWORD.(不是所有编译器都采用这个方法的,我只试过vc6bcc55编译器,它们都采用这个方法.不过,<<深度探索c++对象模型>>上只是说配置一个额外的word<两字节>).为了验证这个说法,我写下了下面的代码进行测试.

#include<iostream.h>

class complex

{

public:

       complex(int=0,int=0){cout<<"complex()"<<endl;}

       ~complex(){cout<<"~complex()"<<endl;}

private:

       int i,j;

};

int main()

{

       complex*array=new complex[10];

       long*t=(long*)((char*)(array)-4);

       cout<<*t<<endl;//(1)

       //*t=20;       //(2)

       delete []array;

return 0;

}

其中(1)输出array数组的维数10.这里很明显了,动态分配complex对象的个数就是放在返回array地址前一个DWORD(四个字节).现在问题解决了,我们已经知道new所作的什么处理了,^_^,不过问题又来了,编译器采取的策略会不会引起我们忧虑??,的确,只要我们修改那个DWORD的内容,delete就不能正确释放所分配的内存空间了.(^_^.你试试把(2)前面那条的注释给去掉,就会有意想不到的输出)

   结论:c++编译器为我们做了太多的事,导致了c++很复杂,有些东西,让编译器修改得连我们都不认识自己的代码了,有些东西如果搞明白了,学其他的(比如COM,ATL等,虽然本问与此关系不大)或许会轻松许多的. 

    补充:这是小弟第一篇处女作,肯定有很多说得不当的地方,还请各位大小谅解.我得于众多csdn上的朋友相助,还参考了侯老师的那本<<深度探索c

++对象模型>>.

free和delete区别

free和mall匹配:释放malloc出来动态内存; delete和new匹配:释放new出来的动态内存空间。 1, malloc/free是c/c++标准库的函数,new/delete除...
  • prefect_boy
  • prefect_boy
  • 2017年03月30日 12:41
  • 162

从内存的角度看free(p) , p=NULL

讲C的书多告诉我们malloc出的内存用完要free掉,为了避免出现
  • wusuopuBUPT
  • wusuopuBUPT
  • 2014年09月02日 15:41
  • 1671

为什么delete p;后最好加上p = NULL; ? (浅谈内存泄露和内存过度释放)

一直很怕内存泄露,内存泄露有时候真的会有严重的后果. 本人在处理内存问题时经常小心翼翼,生怕忘了释放. 但是,上次在某公司实习,我把内存重复释放了,结果引起了程序的错误. 由于程序很大,而且很复杂,所...
  • stpeace
  • stpeace
  • 2012年11月28日 20:27
  • 5999

delete p和delete[] p的区别

/* C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。  关于 new[] 和 del...
  • draft081146
  • draft081146
  • 2015年05月07日 09:31
  • 206

delete p和delete[] p 有什么区别?

答:delete p对应于使用 new去动态创建对象  delete[] p 对应于使用 new[]去动态创建对象数组...
  • xue815020462
  • xue815020462
  • 2013年06月09日 10:10
  • 520

delete p 和delete []p的区别

两者的区别主要有: 1,对于char这样的基础数据类型,delete和delete[]是等价的。 2,对于class A这样带析构函数的类型,delete和delete[]是不同的。 参见 h...
  • wuxuzhao
  • wuxuzhao
  • 2012年08月16日 09:07
  • 1054

delete p与delete p[]的区别

operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:    void* operator new (size_t)...
  • huan_xia
  • huan_xia
  • 2015年01月15日 16:26
  • 167

char *p = new char[256]; delete p; / delete[] p; 哪个对 为什么

原帖地址:http://topic.csdn.net/u/20071027/12/a31bf228-7b4f-40b2-be41-e3b859f643d4.html char *p = ne...
  • yahohi
  • yahohi
  • 2011年08月31日 20:41
  • 2119

C++ free与delete区别

free函数是由C语言继承而来的,是和malloc配对的,而不能和new配对。 free释放内存的和delete可以说是两套代码,它们的逻辑不同,不能混用。用new申请的就要用delete翻译,用ma...
  • u012861978
  • u012861978
  • 2014年10月24日 10:26
  • 4264

P - k-Multiple Free Set

P - k-Multiple Free SetTime Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u...
  • DTL66
  • DTL66
  • 2016年07月27日 21:32
  • 105
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从free(p)到delete[]p
举报原因:
原因补充:

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