堆空间上的内存分布图
// 内存管理测试#include <iostream>using namespace std;
// 静态区地址测试int a = 1; // 0x00434dc0static int b = 3; // 0x00434dc4
// 创建一个长度大于48的类,测试其在堆上的分配规则,测试堆上的// 空间分配的最小单位是否真的为48字节class Big{public:int a[20];// 先测试临界数据,看是否会连续排放};
int main(){// 栈空间地址分配跟静态区分配的地址增长方向相反int k = 1; // 0x0012ff7cint j = 3; // 0x0012ff78
// 堆空间// 堆上分配就比较大方了,每个48字节,同样自下往上的地址分配顺序int* p = new int(1); // p-> 0x00380820int* p2 = new int(1); // p-> 0x00380868// delete p2;// 现在晓得delete的原理了,根据结果来看,p3指向的堆地址接上原p2的堆地址了// delete实现的是将内存划为可用区域原来是这样滴,hoho~~int* p3 = new int(1); // p-> 0x003808b0
// 忘了说一点,这里的指针,四个字节的指针,全部是在栈上的// 后面的地址是通过这些指针保存的地址找到的
char* cp = new char('g');char* cp2 = new char('h');char* cp3 = new char('g');
double* dp = new double(2);double* dp2 = new double(2);double* dp3 = new double(2);
// 用类来做测试用例Big* bp = new Big; // 经测试结果表明:相隔78字节,起始地址接上一个堆地址+48Big* bp2 = new Big;Big* bp3 = new Big;
int* pp = new int(2);cout << hex << pp << endl;// 0x0038 27d8delete pp;pp = 0x00;delete pp;cout << hex << pp << endl;// 0x0000 0000pp = new int(3);delete pp;cout << hex << pp << endl;// 0x0038 27d8cout << *pp << endl;// 因为堆上对于内存的使用是很节约的,因为都是大手笔(最小长度48字节-_-).第一次delete pp之后,会将原来的堆数据写成乱码,但是栈上的指针pp仍旧指向改区域,所以需要将指针赋值为空NULL,也就是0x00一样的啦...至于为什么不能两次delete同一块堆内存,不知道,这个再深究下去估计跟编译器的设计有关了,将数据delete之后肯定加了什么标志量,反正我自己觉得多次delete同一块堆没有什么不好的影响的吧..,但是可以多次delete地址为0的内存.
return 0;}