zoukankan      html  css  js  c++  java
  • windows C++ new/delete内存大小

    转载自:https://blog.csdn.net/will_hsbsch/article/details/21124055

    windows 上,但使用C++语言new一块内存,用指针P指向这块内存,但我们调用delete的时候如何知道我们需要释放的空间大小,毕竟我们只给了一个P指针,并没有给出内存大小。

    在Windows系统上,每当使用new/new[]申请到内存时,回调用系统的API在堆上开出一块我们需要大小的内存。例如:

    int* p = new int[100];

    此时申请成功时,P指向了这块内存的一个元素地址。同时,会在P的前面,记录我们申请的内存大小,这样当我们调用delete []p时,系统才知道我们具体申请的内存大小。

    以下就是P指针地址前面存储我们申请内存信息的结构体:

    //typedef struct _RTL_HEAP_ENTRY {
    //      SIZE_T Size;
    //      USHORT Flags;
    //      USHORT AllocatorBackTraceIndex;
    //      union {
    //              struct {
    //                      SIZE_T Settable;
    //                      ULONG Tag;
    //              } s1;
    //              struct {
    //                      SIZE_T CommittedSize;
    //                      PVOID FirstBlock;
    //              } s2;
    //      } u;
    //} RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY;
    用下面代码查看具体的存储信息 
    
    //   int *p = new int[100];
    //   PRTL_HEAP_ENTRY pHeapEntry=(PRTL_HEAP_ENTRY(p)-1);
    //   printf("i: %d, size: %d
    ", i, pHeapEntry->Size);
    
    以上代码就是通过指针获取内存大小,具体多少字节。 Size存的是字节数
    也可以进行估算,Size 4个字节, Flags 4个字节, union(Settable 4个字节, Tag 4个字节), 所以Size地址与new地址相差16个字节
    实验例子:
    1.
    int *p = new int;
    cout << *(p - 4) << endl; //4
    2.
    int *p = new int[4];
    cout << *(p - 4) << endl; //16

    3. 

    char *p = new char[10];
    cout << *(int*)(p - 16) << endl; //10

     4.

     我们把P向后移动一个位置或者向前,只要不是这块内存的第一个位置,然后我们delete[] p,会有什么后果?后果不可预测!!自己实验下,系统卡死,死循环
  • 相关阅读:
    【1】windows下IOS开发基础环境搭建
    【oracle常见错误】oracle监听程序配置/“ORA-12541: TNS: 无监听程序”
    【oracle】oracle REGEXP_SUBSTR分割字符串
    【Oracle安装卸载】oracle卸载
    【oracle】一些的常用命令
    oracle备份与还原(导入导出)
    oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败
    oracle表空间扩容
    oracle实现like多关键字查询
    __builtin_ _Find_first()
  • 原文地址:https://www.cnblogs.com/dj0325/p/9595491.html
Copyright © 2011-2022 走看看