在c++中更改内存可能会损坏您的计算机

Risk of damaging your computer by altering memory in C++

本文关键字:损坏 计算机 c++ 内存      更新时间:2023-10-16

我知道一些Java,我现在正在尝试c++,而不是显然在c++中,你可以做一些事情,比如声明一个大小为6的int数组,然后改变该数组的第10个元素,我理解为仅仅是第4个字节后的内存部分结束分配给6整数数组。

所以我的问题是,如果我粗心,是否有可能意外地改变我的c++程序中正在被我系统上的其他程序使用的内存?这样真的有把事情搞砸的风险吗?我的意思是,我知道如果必要的话,你可以重启电脑清空内存,但如果我不这样做,可能会造成一些持久的损害。

这取决于您的系统。正式地,越界访问是未定义的行为。在现代通用系统中,每个用户进程有自己的地址空间,一个进程不能修改,甚至不能修改读取另一个进程的数据(共享内存除外),所以除非您编写内核代码时,您不应该能够破坏外部的任何东西您自己的进程(和非内核代码)通常不能执行物理IO,因此我不认为硬件会有什么问题)。

但是,如果您正在编写内核代码,或者在嵌入式处理器没有内存映射或保护,你可以毫不夸张地用越界写入破坏硬件;如果程序是控制核电站之类的东西,你甚至可以摧毁一个

每个进程都有自己的虚拟地址空间,所以自然地进程不会看到彼此的内存。不要忘记,即使是程序本地的缓冲区溢出也会产生可怕的后果——溢出可能会导致程序行为失常,并做出一些具有持久影响的事情(例如删除所有文件)。

这取决于您所处的操作系统和环境:

  • 普通操作系统(Windows, Linux等)用户空间程序:你只能搞砸你自己的进程内存。然而,如果真的运气不好,这就足够了。例如,假设您调用某个删除文件的函数。如果在调用时内存损坏,则函数的参数可能会被弄乱,这意味着删除了您不想删除的其他内容。只要在测试内存处理的程序中不调用删除文件例程等,这种风险就不存在。
  • 正常操作系统,内核空间设备驱动程序:您可以访问系统内存和当前运行进程的内存,可能会破坏所有内容。
  • 简单的嵌入式操作系统没有内存保护:你可以访问和破坏任何东西。
  • 没有内存保护的旧操作系统(win3)。X, MS-DOS):你可以访问和破坏任何东西。

每个程序都在自己的地址空间中运行,一个程序不能访问(读取/修改)任何其他程序的地址空间(这是一种称为分页的内存管理技术)。

如果你试图访问内存中的地址,而你的程序无法读取,它将导致段或页面错误,你的程序将崩溃。

我回答你的问题,不会造成永久性损坏。

我不确定现代操作系统(特别是win7)是否允许您这样做。操作系统将阻止您所描述的缓冲区溢出操作

早在DOS时代,一些病毒会试图通过直接编程视频或硬盘驱动器控制器来破坏硬件,但即使在那时,这也不是一件容易或确定的事情。现代硬件和操作系统使得用户级应用程序几乎不可能损坏硬件。所以编程吧:)你不会破坏任何东西的

还有另一种可能性。缓冲区溢出可能会让不良分子利用这个漏洞,在您的客户计算机上执行任意代码。我想那已经够糟糕的了。而超支最危险的部分是,即使经过严重的过度测试,您也可能找不到它。