2. *((int *)p) = size; //把大小放在分配内存的起始处。 3. return (void*)(p + 4); //返回除去存放大小以后的部分。 free(p); 1. char* q = (char *)p - 4; 3. 通过操作系统释放内存或自己管理C/C++堆内存. 这里要涉及到一些OS管理内存得问题,非我力所能及,但我们可以知道,malloc确实实施了一些特殊的处理.言归正传.让我们看看下面一段c++代码: int*p=new int; delete []p; 能在不指定动态分配的数组size下就能释放所分配的对象呢,是不是new操作也对返回的地址作了一些手脚?答案:是.new所作的处理和上面的方法一样的,即:new所传回的每一个内存区域配置一个额外的DWORD,然后把元素数目包藏到那个DWORD中.(不是所有编译器都采用这个方法的,我只试过vc6和bcc55编译器,它们都采用这个方法.不过,深度探索c++对象模型上只是说配置一个额外的word两字节).为了验证这个说法,我写下了下面的代码进行测试. #includeiostream.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; long*t=(long*)((char*)(array)-4); cout*tendl;//(1) //*t=20; //(2) return 0; } 其中(1)输出array数组的维数10.这里很明显了,动态分配complex对象的个数就是放在返回array地址前一个DWORD(四个字节)内.现在问题解决了,我们已经知道new所作的什么处理了,^_^,不过问题又来了,编译器采取的策略会不会引起我们忧虑对,的确,只要我们修改那个DWORD的内容,那delete就不能正确释放所分配的内存空间了.(^_^.你试试把(2)前面那条的注释给去掉,就会有意想不到的输出)