C++内存管理

    技术2022-05-20  29

    堆空间上的内存分布图

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


    最新回复(0)