托管语言如何确保没有段错误

How does managed language ensure no segfault

据我所知(如果我错了请纠正我),托管语言(或至少 C#)不会产生任何 segfault(至少当没有 Unsafe 或直接处理 unmanaged memory)。这与非托管语言(或至少是 C++)相反,在非托管语言中,您只需在编码时看一眼附近的猫就可以获得 segfault

问题:托管语言如何确保这一点?他们的运行时库是否经过精心构建和测试。或者他们有办法捕获这些段错误并以某种方式处理它?

这个问题背后的动机:我有一个调用本机 C++ 库的 C# 应用程序(两者都是我构建的)。当我的 C++ DLL 发生段错误时,整个应用程序都会崩溃(某些服务会崩溃),这根本不是一件好事。我知道当出现段错误时,这意味着某些事情做错了,需要更正。但是,至少我想要一些机制来解决这个问题,当错误的(可能导致段错误)C++ DLL 在客户机器上运行时。

  1. 它们不允许您手动释放内存。
  2. 它们不允许您 read/write from/to 任意内存地址(C++ 也不允许这样做,但语言语法使它成为可能)。
  3. (作为上述的一种特殊形式)他们检查每个数组访问是否在数组的范围内
  4. 据我所知,它们没有未定义的行为(调用不安全代码时当然除外)

I want some mechanism to solve this problem when the buggy (may cause segfault) C++ DLL is working on the customer machine.

问题是即使你可以让你的程序继续(我不知道 Windows/c# 是否提供任何机制来做到这一点),它可能不再处于有效状态,所以根据错误是什么以及您的程序可以访问哪种资源,这实际上可能会导致比程序崩溃更严重的错误,包括用户数据的破坏。