【发布时间】:2022-08-16 21:40:12
【问题描述】:
通过内存保护,我的意思是以下程序将在许多机器上抛出运行时异常:
#include <iostream>
int main() {
int* my_int = new int[12];
std::cout << my_int[20000];
delete(my_int);
return 0;
}
该程序给出以下错误:
Exception thrown at 0x00007FF7A467101A in myprogram.exe: 0xC0000005: Access violation reading location 0x000002794CA635C0.
因为每个进程都有自己的虚拟内存,所以我的代码中已经保护了其他程序免受访问冲突的影响。在我看来,正确的程序会付出运行时成本,因为错误的程序可能会访问未分配的内存。
为什么计算机会在调试模式之外为防止访问违规而烦恼?
-
即使使用虚拟内存地址,地址也必须由操作系统管理的物理内存支持。因此,必须显式分配内存,以便操作系统可以为您的特定进程保留它(或将其关联到)。
-
当您遇到访问错误(包括越界错误)时,这意味着您的程序存在逻辑错误或已进入未定义行为。当你的程序处于这种状态时,它是不可靠的,通常最好阻止它做任何其他事情。
-
考虑虚拟内存如何映射虚拟地址。如果
my_int + 20000;生成的地址没有映射到此过程的任何内容,您期望什么结果?取消引用指针没有可以读取的有意义的值,甚至没有可以读取的未初始化内存。 -
甚至虚拟内存也是有限的资源,并且可以用完所有虚拟内存地址空间而不会耗尽物理内存(按需加载页面)。所以操作系统喜欢知道每个程序可以访问多少虚拟地址空间。
-
@MarkWallace 分段错误是特定于平台的错误状态,它是具有未定义行为的代码的可能结果。它发生的时间和地点取决于您的平台。
标签: c++ memory-management allocation access-violation virtual-memory