![](https://i-blog.csdnimg.cn/blog_migrate/b98bec3b50ce18cc79a1a37c3c2b7b5c.jpeg)
// 内存管理测试
#include <iostream>
using namespace std;
// 静态区地址测试
int a = 1; // 0x00434dc0
static int b = 3; // 0x00434dc4
// 创建一个长度大于48的类,测试其在堆上的分配规则,测试堆上的
// 空间分配的最小单位是否真的为48字节
class Big
{
public:
int a[20];// 先测试临界数据,看是否会连续排放
};
int main()
{
// 栈空间地址分配跟静态区分配的地址增长方向相反
int k = 1; // 0x0012ff7c
int j = 3; // 0x0012ff78
// 堆空间
// 堆上分配就比较大方了,每个48字节,同样自下往上的地址分配顺序
int* p = new int(1); // p-> 0x00380820
int* 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字节,起始地址接上一个堆地址+48
Big* bp2 = new Big;
Big* bp3 = new Big;
int* pp = new int(2);
cout << hex << pp << endl;// 0x0038 27d8
delete pp;
pp = 0x00;
delete pp;
cout << hex << pp << endl;// 0x0000 0000
pp = new int(3);
delete pp;
cout << hex << pp << endl;// 0x0038 27d8
cout << *pp << endl;
// 因为堆上对于内存的使用是很节约的,因为都是大手笔(最小长度48字节-_-).第一次delete pp之后,会将原来的堆数据写成乱码,但是栈上的指针pp仍旧指向改区域,所以需要将指针赋值为空NULL,也就是0x00一样的啦...至于为什么不能两次delete同一块堆内存,不知道,这个再深究下去估计跟编译器的设计有关了,将数据delete之后肯定加了什么标志量,反正我自己觉得多次delete同一块堆没有什么不好的影响的吧..,但是可以多次delete地址为0的内存.
return 0;
}