• 释放内存触发断点及数组、指针的NULL初始化


    Visual Studio调试时,出现“触发一个断点”内存释放出现异常

    数组和对应指针的NULL初始化

    数组使用之前要先对其初始化

    char Outi[4] = { NULL };
    char Outj[4] = { NULL };

    对应指针进行动态初始化

     1 #define SIZE 4
     2 
     3 char *Outi = (char *)malloc(SIZE * sizeof(char));
     4 memset(Outi, 0, SIZE * sizeof(char));
     5 
     6 for (int i = 0; i <4; i++)
     7     strcat(Outi, "1");
     8 
     9 
    10 free(Outi);
    11 Outi = NULL;

    分配内存后,需要对内存进行释放,程序对内存进行释放后,并不会将其置为NULL,必须手动将指针置为NULL,防止访问野指针或再次释放出错。

    释放内存触发断点

    上面对应指针进行初始化的代码中,运行起来会在释放内存处触发断点,因为Outi开辟了4个char的内存,但是strcat函数执行后会在结尾添加NUL字节,即''结尾标识符,则会超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,因此释放时会报错,这种错误称为缓冲区溢出

    解决方法:指针开辟动态内存时,需要多开辟一个数据类型的空间。

    缓冲区溢出:缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区 又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

    栈溢出:栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。

    栈溢出是缓冲区溢出的一种。

  • 相关阅读:
    Vue中使用axios时post传参之请求体带参
    MyBatisPlus常用功能之简介
    常用命令一二三之练习题
    常用命令之三
    常用命令之二
    常用命令之一
    阿里云之轻量文件分布式服务器-fastDFS
    js三座大山之三:异步和单线程
    js三座大山之二:作用域和闭包
    run build时内存溢出打包失败的解决办法
  • 原文地址:https://www.cnblogs.com/qinguoyi/p/10149909.html
Copyright © 2020-2023  润新知