在c++中更改内存可能会损坏您的计算机
Risk of damaging your computer by altering memory in C++
我知道一些Java,我现在正在尝试c++,而不是显然在c++中,你可以做一些事情,比如声明一个大小为6的int数组,然后改变该数组的第10个元素,我理解为仅仅是第4个字节后的内存部分结束分配给6整数数组。
所以我的问题是,如果我粗心,是否有可能意外地改变我的c++程序中正在被我系统上的其他程序使用的内存?这样真的有把事情搞砸的风险吗?我的意思是,我知道如果必要的话,你可以重启电脑清空内存,但如果我不这样做,可能会造成一些持久的损害。
这取决于您的系统。正式地,越界访问是未定义的行为。在现代通用系统中,每个用户进程有自己的地址空间,一个进程不能修改,甚至不能修改读取另一个进程的数据(共享内存除外),所以除非您编写内核代码时,您不应该能够破坏外部的任何东西您自己的进程(和非内核代码)通常不能执行物理IO,因此我不认为硬件会有什么问题)。
但是,如果您正在编写内核代码,或者在嵌入式处理器没有内存映射或保护,你可以毫不夸张地用越界写入破坏硬件;如果程序是控制核电站之类的东西,你甚至可以摧毁一个
每个进程都有自己的虚拟地址空间,所以自然地进程不会看到彼此的内存。不要忘记,即使是程序本地的缓冲区溢出也会产生可怕的后果——溢出可能会导致程序行为失常,并做出一些具有持久影响的事情(例如删除所有文件)。
这取决于您所处的操作系统和环境:
- 普通操作系统(Windows, Linux等)用户空间程序:你只能搞砸你自己的进程内存。然而,如果真的运气不好,这就足够了。例如,假设您调用某个删除文件的函数。如果在调用时内存损坏,则函数的参数可能会被弄乱,这意味着删除了您不想删除的其他内容。只要在测试内存处理的程序中不调用删除文件例程等,这种风险就不存在。
- 正常操作系统,内核空间设备驱动程序:您可以访问系统内存和当前运行进程的内存,可能会破坏所有内容。
- 简单的嵌入式操作系统没有内存保护:你可以访问和破坏任何东西。 没有内存保护的旧操作系统(win3)。X, MS-DOS):你可以访问和破坏任何东西。
每个程序都在自己的地址空间中运行,一个程序不能访问(读取/修改)任何其他程序的地址空间(这是一种称为分页的内存管理技术)。
如果你试图访问内存中的地址,而你的程序无法读取,它将导致段或页面错误,你的程序将崩溃。
我回答你的问题,不会造成永久性损坏。
我不确定现代操作系统(特别是win7)是否允许您这样做。操作系统将阻止您所描述的缓冲区溢出操作
早在DOS时代,一些病毒会试图通过直接编程视频或硬盘驱动器控制器来破坏硬件,但即使在那时,这也不是一件容易或确定的事情。现代硬件和操作系统使得用户级应用程序几乎不可能损坏硬件。所以编程吧:)你不会破坏任何东西的
还有另一种可能性。缓冲区溢出可能会让不良分子利用这个漏洞,在您的客户计算机上执行任意代码。我想那已经够糟糕的了。而超支最危险的部分是,即使经过严重的过度测试,您也可能找不到它。
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 我可以使用任何好的逻辑来阻止计算机将 O 放在井字游戏中的现有 X 上
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- C++ 计算机猜测用户数量在 7 次猜测以内
- C++为什么我的编译器成功了,但我的计算机给出了调试错误?
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 在c++中更改内存可能会损坏您的计算机