2021-04-19C/C++学习00
请注意,本文编写于 589 天前,最后修改于 589 天前,其中某些信息可能已经过时。

目录


调试版堆格式

  1. 第一个4字节是前面一个堆的位置

  2. 第二个4个字节是后面一个堆的位置

  3. 第三个4字节是申请当前堆块所在文件的全路径

  4. 第四个4字节是申请当前堆所在的行

  5. 第五个4字节是申请的堆的能用的空间size,不含冗余数据

  6. 第六个4字节是堆的类型

  7. 第七个4字节是堆的编号

  8. 接下来的FD FD FD FD是堆的上溢标志,当用操作堆使用指针做--,不小心越界时,那么这4个FD就没了

  9. 接着就是堆的正文CD,

  10. 正文后的FD FD FD FD是堆的下溢标志,当用操作堆使用指针做++,不小心越界时,那么这4个FD就没了
    调试堆格式

堆的正文

_malloc_dbg

非标准函数 ,需要包含<crtdbg.h>

c
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <crtdbg.h>
int main()
{
    void *pv = _malloc_dbg(8,_NORMAL_BLOCK,__FILE__,__LINE__);
    strcpy((char *)pv, "hello");
    free(pv);

    system("pause");
    return(0);
}

兼容宏

c
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <crtdbg.h>

# ifdef  _DEBUG
# define malloc(size) _malloc_dbg(size,_NORMAL_BLOCK,__FILE__,__LINE__)
# endif
int main()
{
    void *pv = malloc(8);
    strcpy((char *)pv, "hello");
    free(pv);

    system("pause");
    return(0);
}

规范

  1. 定义指针或资源引用型变量时,初值必须设定为无效值。(NULL)
c
int *pInt = NULL;//赋无效值
  1. 申请资源后必须检查,资源是否失败
c
pInt = (void *)malloc(sizeof(int))
if(pInt == NULL)
{
    //如果失败,转到异常处理
    ERROR();

    //转到出口
    goto EXIT_PROC;
}
//使用资源
*pInt = 999;

EXIT_PROC:
//在出口处,检查指针或资源是否有效
    if(pInt != NULL)
    {
    //如果有效,则释放资源(指针、文件等)
        free(pInt);
        //释放完后,指针或资源引用型变量必须置为无效值
        PInt = NULL;
    }

本文作者:Na1r

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!