通过在C++中更改内存来损坏计算机的风险

new*_*mer 9 c++ memory

我知道一些Java而且现在正在尝试使用C++而且显然在C++中你可以做一些事情,比如声明一个大小为6的int数组,然后改变那个数组的第10个元素,我理解它只是之后的第4个字节.为6整数数组分配的内存部分的结尾.

所以我的问题是,如果我不小心可能会意外地改变我的系统中其他程序正在使用的C++程序中的内存?是否存在以这种方式严重搞乱某些事情的实际风险?我的意思是我知道你可以重新启动计算机并清除内存,但如果我不这样做,可能会有一些持续的损害.

Jam*_*nze 16

这取决于您的系统.正式地,越界访问是未定义的行为.在现代通用系统中,每个用户进程都有自己的地址空间,一个进程不能修改甚至读取另一个进程的进程(禁止共享内存),所以除非你编写内核代码,否则你不应该'能够破坏你自己进程之外的任何东西(非内核代码通常不能进行物理IO,所以我看不出硬件中的任何东西会破坏).

但是,如果您正在编写内核代码,或者在没有内存映射或保护的嵌入式处理器上工作,那么您可以通过越界写入来破坏硬件; 如果程序控制的是像核电站这样的东西,你甚至可以摧毁比运行代码的机器更多的东西.


sha*_*oth 6

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

  • @newprogrammer:不要太早放松。我们有这个 gem http://stackoverflow.com/questions/908872/whats-the-worst-example-of-undefined-behaviour-actually-possible/3554343#3554343 即使没有写过数组边界 - 只是读过边界. 它导致一些不相关的数据通过网络发送,这可能是一个巨大的问题。 (2认同)