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

本文关键字:段错误 错误 语言 何确保 确保 | 更新日期: 2023-09-27 18:30:52

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

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

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

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

  1. 它们不允许您手动释放内存。
  2. 它们不允许您从任意内存地址读取/写入(C++也不允许这样做,但语言语法使之成为可能)。
  3. (作为上述的特殊形式)它们检查每个数组访问是否在数组的边界内
  4. 据我所知,他们没有未定义的bahavior(除了courese,当调用不安全的代码时)

当错误(可能导致段错误)C++DLL在客户机器上工作时,我想要一些机制来解决此问题。

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