基本上,内存损坏是由您不应该覆盖的内存覆盖造成的。我想知道,在C#中的不安全代码(即不调用外部非托管代码)中是否可能出现这种情况。我看到两种可能的情况:
在这两种情况下,运行时似乎检测并防止潜在的内存损坏发生。因此,是否有可能使用不安全的代码从C#损坏内存?因此,从不安全的代码中捕获AccessViolationExceptions是安全的吗?
发布于 2013-08-21 19:46:02
访问指向无效随机内存位置的指针
如果它是读的,它是安全的。如果它是写的,如果内存位置碰巧是有效的,那么它是不安全的,但是您没有拥有它。你会在随机的记忆位置上乱写。
因此,从不安全的代码中捕获AccessViolationExceptions是安全的吗?
不,因为该异常告诉您:( a)您有一个错误;( b)内存可能已损坏,无法修复。抓住它,尽快拆掉这个过程。
发布于 2013-08-21 20:13:01
你错过了大子弹:
这是非常常见的,在一个.NET程序中总是有很多可写内存。包括在数组结束后编写元素,它很少使用炸弹。内存保护在内存页边界是细粒度的,在Windows上为4096字节。.NET GC很大程度上增加了这一点,分代堆段是很好的VM大块头。抓AVEs是非常不明智的。
要使用的一些代码:
class Program {
static unsafe void Main(string[] args) {
var arr = new byte[1];
for (int fill = 0; fill < 2 * 1024 - 64; ++fill) {
byte[] dummy = new byte[1024];
}
fixed (byte* p = &arr[0]) {
for (int ix = 1; ; ++ix)
p[ix] = 42;
}
}
}超过约1.5兆字节。
发布于 2013-08-21 19:55:34
C#中的不安全代码会导致内存损坏吗?
答案是“是”,请考虑下面的示例。
int a = 10;
int* p = &a;
*(p+54)= 444;CLR可能会也可能不会捕捉到这种情况。
并非所有通过错误指针进行的读或写都会导致访问冲突,因此访问冲突通常表示通过错误的指针发生了几次读或写,并且内存可能已损坏。
来自附件-例外文件
https://stackoverflow.com/questions/18366296
复制相似问题