zoukankan      html  css  js  c++  java
  • 释放内存触发断点及数组、指针的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字节,即''结尾标识符,则会超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,因此释放时会报错,这种错误称为缓冲区溢出

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

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

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

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

  • 相关阅读:
    Maven学习笔记
    [学习笔记] 网络流
    [Contest on 2021.11.3] 女子口阿
    [杂题合集] 25 岁小伙突然没了心跳,他的习惯很多年轻人都有!
    CSP 2021 提高组游记
    [题目小结] 可持久化数据结构
    [学习笔记] 无向图和有向图的连通分量
    [Contest on 2021.10.17] HustOJ 就是个 **
    [Contest on 2021.10.15] 细思极恐
    妖怪寺外,灯火通明
  • 原文地址:https://www.cnblogs.com/qinguoyi/p/10149909.html
Copyright © 2011-2022 走看看