托管语言如何确保不会出现段错误

时间:2016-01-19 08:04:11

标签: c# c++ memory-management segmentation-fault unmanaged

据我所知(如果我错了请纠正我),托管语言(或至少是C#)不会产生任何segfault(至少在没有Unsafe或直接交易时与unmanaged memory)。这与非托管语言(或至少是C ++)相反,你可以通过在编码时看一下你附近的猫来获得segfault

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

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

1 个答案:

答案 0 :(得分:2)

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

    我想要一些机制来解决这个问题,当bug(可能导致segfault)C ++ DLL在客户机器上运行时。

    问题是,即使你可以允许程序继续(我不知道Windows / c#是否提供任何机制来执行此操作),它可能不再处于有效状态,因此取决于错误是程序可以访问的是什么样的资源,这实际上可能导致更糟糕的错误,而不仅仅是程序崩溃,包括用户数据的破坏。