.net C+中异常处理的澄清+/本机/托管混合场景中的CLI

.net C+中异常处理的澄清+/本机/托管混合场景中的CLI,.net,visual-c++,exception-handling,c++-cli,mixed-mode,.net,Visual C++,Exception Handling,C++ Cli,Mixed Mode,我们有一个使用本机库的应用程序,它是用C++/CLI编写的 我们的本地库有自己的C++异常类,ErrExExcExcor。 代码的结构方式是,应用程序的主循环使用本机代码,然后本机代码调用(托管)应用程序代码,后者有时又调用回本机库 本机库是用/EHsc编译的(除了一个用/EHa编译的库,这在我看来是错误的,因为catch(…)捕获结构化异常,例如访问冲突!) 我所做的是将(大多数)函数包装在C++/CLI代码中,我相信它可以在managed\u TRY\u START/managed\u TR

我们有一个使用本机库的应用程序,它是用C++/CLI编写的

<>我们的本地库有自己的C++异常类,ErrExExcExcor。 代码的结构方式是,应用程序的主循环使用本机代码,然后本机代码调用(托管)应用程序代码,后者有时又调用回本机库

本机库是用/EHsc编译的(除了一个用/EHa编译的库,这在我看来是错误的,因为catch(…)捕获结构化异常,例如访问冲突!)

我所做的是将(大多数)函数包装在C++/CLI代码中,我相信它可以在
managed\u TRY\u START
/
managed\u TRY\u END
宏中引发托管异常,定义如下:

#define MANAGED_TRY_START try {
#define MANAGED_TRY_END \
    } \
    catch(System::Runtime::InteropServices::SEHException^) { \
        throw; \
    } \
    catch(System::Exception^ ex) { \
        ConvertAndThrowSystemException(ex); \
        throw NULL; \
    } \
使用将System::Exception转换为ErrorException并抛出该异常的函数

现在,我的问题是,这足够了吗?我这样问是因为这个特定的应用程序经常显示不稳定和内存问题,我担心异常是错误的

另一方面,我们在windows上使用dr.memory作为本机代码的Valgrind替代品,但它似乎不喜欢.Net。是否有人建议使用类似的工具?我们已经尝试过Deleaker,我们从中得到了非常奇怪的结果,比如它声称堆栈分配的对象正在泄漏

具体来说,让我们假设堆栈如下所示: foo()[本机] bar()[managed] foobar()[本机]

和FoE()抛出C++异常。foobar()对foo的调用位于try块中,该块具有foo()抛出的类型的相应catch()块。foobar()是用/Ehsc编译的

下列哪一个案例有FoBoBar()捕获异常,所有的C++堆栈对象都被正确地销毁,如果两者都有?

  • bar()没有try/catch
  • bar()的内容包装在my
    MANAGED\u TRY\u START
    /
    MANAGED\u TRY\u END
    宏中

    • /EHa
      不是问题。使用
      catch(…)
      是问题所在

      <代码> /EHA < /C> >是唯一的方法,都有OS异常(.NET异常包含在这一类)中适当地解压缩C++堆栈帧,并且C++异常正确地解开.NET堆栈帧。

      大多数代码实例> catch(…)在我提到的库中,是为了防止C++异常跨越DLL/语言边界,并且没有太多的替代。