C、C++常见内存操作问题 内存溢出 内存泄漏 内存越界 缓冲区溢出

常见内存操作问题

常见内存操作问题,本文简单整理了内存溢出(out of memory), 内存泄露(memory leak),内存越界,缓冲区溢出(buffer overflow)方面的信息。

文章目录

  • 常见内存操作问题
  • [1、内存溢出out of memory](#1、内存溢出out of memory)
  • [2、内存泄露memory leak](#2、内存泄露memory leak)
  • 3、内存越界
    • [3.1 内存越界与内存溢出的区别](#3.1 内存越界与内存溢出的区别)
  • [4、缓冲区溢出buffer overflow](#4、缓冲区溢出buffer overflow)
    • [4.1 内存越界和缓冲区溢出的区别](#4.1 内存越界和缓冲区溢出的区别)
    • [4.2 缓冲区溢出的原因](#4.2 缓冲区溢出的原因)

1、内存溢出out of memory

内存溢出out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。

如malloc new等操作。

2、内存泄露memory leak

内存泄露memory leak,是指程序在申请内存后,无法释放已申请的内存空间;内存泄露堆积后果就是用光内存,出现out of memory。

如malloc操作后,没有free;new操作后没有delete。

3、内存越界

向系统申请了一块内存,而在使用内存时,超出了申请的范围(常见的有使用特定大小数组时发生内存越界)。

C对于数组指针引用不进行任何边界检查,且局部变量和状态信息都存放在栈中。对越界的数组元素的写操作会破坏存储在栈中的状态信息。当程序使用这个被破坏的状态,试图重新加载寄存器或执行ret指令,就会出现严重的错误。

内存越界一般不引起编译器的警觉,会在运行阶段产生莫名其妙的后果,或者越得较严重的被操作系统捕捉到,而进行处理(弹出对话框并结束该进程)。

如下代码:

char str[] = "Hello World!";

char buf[10] = {0};

strcpy(buf, str); //out of buffer space

将str字符串中的字符(含空格)复制到只能容纳下10个字符的buf数组中,结果导致内存越界。

3.1 内存越界与内存溢出的区别

内存越界在使用系统提供的内存时,做了一些超出申请的内存范围的操作;内存溢出是在申请内存大小时就已超出系统能提供的。

4、缓冲区溢出buffer overflow

程序在运行过程中,为了临时存取数据(用户输入数据、程序临时数据)的需要,一般都要分配一些内存空间(存储位置:Stack(栈)、Heap(堆)、数据段),通常称这些空间为缓冲区(其本质:数组)。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。

当计算机向缓冲期内填充数据位数时,超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。往往会引发不可预料的后果。

操作系统所使用的缓冲区又被称为"堆栈"。在各个操作进程之间,指令会被临时存储在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

缓冲区溢出类型有:栈溢出(缓冲区在栈中分配)、堆溢出(缓冲区在栈中分配)。

4.1 内存越界和缓冲区溢出的区别

越界访问,是编程粗心造成的,是被动的,没有恶意。

缓冲区溢出,是一种攻击手段,是主动的,恶意的。

4.2 缓冲区溢出的原因

(1) 在C语言中,指针和数组越界是Buffer overflow的根源。而且,在C语言标准库中就有许多能提供溢出的函数,如strcat(),strcpy(),sprint(),vsprintf(),bcopy(),gets()和scanf()。

(2) 通过指针填充数据。

(3) 不好的编程习惯。

相关推荐
elseif1233 小时前
出题团招人【ETOI_】
c++
Amour恋空3 小时前
Java多线程
java·开发语言·python
小陈工3 小时前
2026年3月28日技术资讯洞察:5G-A边缘计算落地、低延迟AI推理革命与工业智造新范式
开发语言·人工智能·后端·python·5g·安全·边缘计算
第二只羽毛3 小时前
C++ 高并发内存池1
大数据·开发语言·c++·开源
不想看见4044 小时前
C++/Qt 实习岗位深度解析【结合一次研发实习谈感受】
开发语言·c++·qt
王老师青少年编程4 小时前
信奥赛C++提高组csp-s之组合数学专题课:鸽巢原理详解及案例实践
c++·组合数学·信奥赛·抽屉原理·csp-s·提高组·鸽巢原理
sjmaysee4 小时前
Java框架SpringBoot(一)
java·开发语言·spring boot
寒秋花开曾相惜4 小时前
(学习笔记)3.8 指针运算(3.8.3 嵌套的数组& 3.8.4 定长数组)
java·开发语言·笔记·学习·算法
想唱rap4 小时前
Linux线程
java·linux·运维·服务器·开发语言·mysql
Tony Bai4 小时前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust