Mar*_*ace 1 c++ memory-management allocation virtual-memory access-violation
通过内存保护,我的意思是以下程序将在许多机器上抛出运行时异常:
#include <iostream>
int main() {
int* my_int = new int[12];
std::cout << my_int[20000];
delete[] my_int;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序给出以下错误:
Exception thrown at 0x00007FF7A467101A in myprogram.exe: 0xC0000005: Access violation reading location 0x000002794CA635C0.
Run Code Online (Sandbox Code Playgroud)
由于每个进程都有自己的虚拟内存,因此其他程序已经受到保护,免受我的代码中的访问冲突的影响。在我看来,正确的程序会付出运行时成本,因为不正确的程序可能会访问未分配的内存。
为什么计算机在调试模式之外还要费力地防止访问违规?
编辑:这个问题的一个很好的初步答案是“这些检查通常是在硬件中完成的”。接下来的问题是“如果不需要在访问冲突上引发异常,是否可以制造出更快的硬件? ”由于 CPU 硬件优化的大部分内容都与空间有关,我认为答案是“肯定是的,但不是”足够值得了。” 我们在硬件上为访问违规检查支付了多少成本?
C++ 可能会说越界访问具有未定义的行为,但它运行的平台将是确定性的。
当您访问未映射的虚拟地址时,系统必须执行某些操作。在非玩具系统上,引发内存保护信号是在硬件中完成的,因此您不能真正说存在性能损失。
| 归档时间: |
|
| 查看次数: |
335 次 |
| 最近记录: |