C++内存管理

堆空间上的内存分布图

// 内存管理测试
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值