В основном, повреждение памяти вызвано перезаписью памяти, которую вы не должны перезаписывать. Мне интересно, возможно ли это с помощью небезопасного кода в C# (т. Е. Не путем вызова внешнего неуправляемого кода). Я вижу два возможных случая:Может ли небезопасный код на C# вызывать повреждение памяти?
- Доступ к нулевому указателю -> захватывается CLR, бросает NullReferenceException
- Доступа указателя на неправильное место случайной памяти -> захватывается CLR, бросает AccessViolationException
В обоих случаях кажется, что среда исполнения обнаруживает и предотвращает возникновение потенциального повреждения памяти. Таким образом, можно ли испортить память из C# с помощью небезопасного кода? И как следствие, безопасно ли улавливать AccessViolationExceptions из небезопасного кода?
В C# это NullReferenceExcoption. И я сомневаюсь, что clr сделает одно и то же исключение для управляемых и неуправляемых нулевых различий. –
Исправлено, спасибо. Да, это одно и то же исключение, вы легко можете попробовать это самостоятельно, т. Е. «Var ptr = (int *) 0; * ptr = 1; // throws NullReferenceException' – Asik
Также обратите внимание, что в .net 4.0 по умолчанию ваш процесс будет прекращен, если есть индикация поврежденного состояния. http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#Four –