C# 托管语言如何确保无故障

C# 托管语言如何确保无故障,c#,c++,memory-management,segmentation-fault,unmanaged,C#,C++,Memory Management,Segmentation Fault,Unmanaged,据我所知(如果我错了请纠正我),托管语言(或至少C#)不会使任何segfault(至少在没有不安全的情况下,或者直接处理非托管内存时是如此)。这与非托管语言(或至少是C++)相反,在非托管语言中,您只需在编写代码时看一下附近的cat,就可以获得segfault 问题:托管语言如何确保这一点?他们的运行库是如此仔细地构建和测试的。或者他们有办法抓住这些错误并以某种方式处理 >动机< /强>后面的问题:我有C应用程序,调用一个本地C++库(两者都是我自己构建的)。当我的C++ DLL做了StEn

据我所知(如果我错了请纠正我),托管语言(或至少C#)不会使任何
segfault
(至少在没有
不安全的情况下,或者直接处理
非托管内存时是如此)。这与非托管语言(或至少是C++)相反,在非托管语言中,您只需在编写代码时看一下附近的cat,就可以获得
segfault

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

<强> >动机< /强>后面的问题:我有C应用程序,调用一个本地C++库(两者都是我自己构建的)。当我的C++ DLL做了StEngEt,整个应用程序就会下降(有些服务会下降),这根本不是好事。我知道,当得到SEGFULT时,这意味着有些事情做错了,需要纠正。但是,至少当C++(BaseGUI)可能会导致客户机上的C++DLL工作时,我希望有一些机制来解决这个问题。

  • 它们不允许您手动释放内存
  • 它们不允许您读取/写入任意内存地址(C++也不允许这样做,但语言语法使之成为可能)
  • (作为上面的一种特殊形式)它们检查每个数组访问是否在数组的边界内
  • 据我所知,它们没有未定义的bahavior(除了courese,当调用不安全代码时)
  • < P>我希望有一些机制来解决这个问题,当BuGy(可能会导致Sebug)C++客户端在客户机上工作时。
    问题是,即使您允许您的程序继续运行(我不知道Windows/c是否提供了任何机制),它也可能不再处于有效状态,因此根据错误是什么以及您的程序可以访问什么类型的资源,这实际上可能会导致比程序崩溃更严重的错误,包括用户数据的破坏。

    如果你使用一个可能崩溃的“不安全”DLL,那么这个崩溃会使你的整个程序崩溃,对此你无能为力。您可以做的是将主程序与使用不安全DLL的部分分离,从而将影响降至最低。这样,如果DLL崩溃,那么您的主程序仍将运行,可以检测到崩溃已经发生,并再次启动失败的程序。然而,找到并修复崩溃可能更容易、更快。@JoachimPileborg我完全同意你的观点,修复问题是唯一合乎逻辑的解决方案。但是我甚至不能拿日志来知道发生了什么。。我收到的最好的日志信息是。“您的程序有问题”:D@HumamHelfawi添加内部日志和跟踪,写入您自己的日志文件。如果你不能使用调试器,它至少可以帮助缩小位置。你能重现错误吗?你是说发生在某台客户机上或一般情况下的错误吗?换句话说,他们使用防御方法,根本不捕捉这些错误。他们只是确保不会发生?原则上是的。但是,您仍然可以有例如
    nullReferenceException
    IndexOutOfRangeException
    ,但与segfault相反,这些错误可以被标准语言构造捕获。是的,这些错误非常友好。。。感谢您澄清:)我认为主要的优点是,如果您尝试使用空引用或越界索引,您肯定会遇到错误,这意味着,它们更有可能在测试期间被发现,并且更容易修复。另一方面,SeaFaaLT只是C++中的这些违规行为的一个可能结果(通常是由取消NulLPTR引起的,但即使是这样也不能保证)。是的,UB可能导致Sebug,而不是使它更糟。