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

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

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

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

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

最佳答案

  1. 它们不允许您手动释放内存。
  2. 它们不允许您从/向任意内存地址读取/写入(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# 是否提供任何机制来执行此操作),它也可能不再处于有效状态,因此取决于错误的内容以及您的程序可以访问哪种资源,这实际上可能会导致比程序崩溃更严重的错误,包括用户数据的破坏。

关于c# - 托管语言如何确保没有段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34871394/

相关文章:

c# - LINQ 到实体 : using Contains in the "select" portion throws unexpected error

C# .NET 和直接对象集合

c++ - cppcheck 如何抑制内联不匹配抑制?

c++ - 没有规则使目标 *.so

c# - 字典中的空键条目

c# - WPF、C#、SQL - 在数据库中创建行

c++ - 尽管有 if 语句,Visual Studio 仍尝试包含 linux header

c# - ObjectSet的Where()方法和内存

javascript - 运行 javascript 过夜后系统挂起

c++ - 低 RAM 使用率 + 频繁分配/释放导致 Linux 换出其他程序