据我所知(如果我错了请纠正我),托管语言(或至少是 C#)不会产生任何 segfault
(至少当没有 Unsafe
或直接处理 unmanaged memory
时)。这与非托管语言(或至少是 C++)相反,您可以在其中获取 segfault
只需在编码时看一眼附近的猫即可。
问题:托管语言如何确保这一点?他们的运行时库构建和测试得如此仔细吗?或者他们有某种方法来捕获这些段错误并以某种方式处理它?</p>
这个问题背后的动机:我有一个调用 native C++ 库的 C# 应用程序(两者都是我构建的)。当我的 C++ DLL 出现段错误时,整个应用程序就会崩溃(某些服务会崩溃),这根本不是一件好事。我知道当出现段错误时,这意味着某些事情做错了并且需要纠正。然而,至少我想要一些机制来解决当有缺陷(可能导致段错误)的 C++ DLL 在客户机器上运行时的这个问题。
最佳答案
- 它们不允许您手动释放内存。
- 它们不允许您从/向任意内存地址读取/写入(C++ 也不允许这样做,但语言语法使之成为可能)。
- (作为上述的特殊形式)它们检查每个数组访问是否在数组的范围内
- 据我所知,它们没有未定义的行为(当然,调用不安全代码时除外)
I want some mechanism to solve this problem when the buggy (may cause segfault) C++ DLL is working on the customer machine.
问题是,即使您可以允许程序继续(我不知道 Windows/c# 是否提供任何机制来执行此操作),它也可能不再处于有效状态,因此取决于错误的内容以及您的程序可以访问哪种资源,这实际上可能会导致比程序崩溃更严重的错误,包括用户数据的破坏。
关于c# - 托管语言如何确保没有段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34871394/