在CLI中抛出std :: exception会引发访问冲突

时间:2019-06-21 08:39:25

标签: c++ exception access-violation

由于我的C ++代码中有一些C#依赖关系,我被迫使用CLI。 在此依赖关系出现之前,我编写了一个异常,该异常继承自std :: exception。现在,每当我抛出此异常时,程序就会崩溃,并出现来自ntd.dll的访问冲突异常。

因此,我将包含异常的头文件放在新的CLI项目中,并尝试对其进行编译。这给了我一个错误,即“ exception”不是std的成员。在包含<exception>之后,这个错误消失了(当然),但是我想知道为什么以前没有必要这样做。 无论如何,这是我在基本示例中的代码:

异常标头:

#pragma once

#include <exception>

//Device is offline
struct E_DvcOffline : public std::exception
{
    const char * what() const throw ()
    {
        return "The Device is offline";
    }
};

主要功能:

#include <MyExceptions.hpp>
#include <iostream>

using namespace System;




int main(array<String^>^ args) {

    try {

        throw E_DvcOffline();
    }
    catch (E_DvcOffline) {

        std::cout << "Caught it" << std::endl;
        std::cin.get();
    }


}

当代码引发自定义异常时,还会收到异常:

Not able to embed pictures yet...

预先感谢, 加尔文

编辑

throw new E_DvcOffline();更改为throw E_DvcOffline();

1 个答案:

答案 0 :(得分:1)

我能够解决此问题。

#pragma once
**#pragma managed(push, off)**

#include <exception>

//Device is offline
struct E_DvcOffline : public std::exception
{
    const char * what() const throw ()
    {
        return "The Device is offline";
    }
};
**#pragma managed(pop)**

变化是螺栓。 我没有进行搜索,但是我认为这告诉编译器将此代码视为非托管代码,因此调用了本机异常处理程序。

警告:当您在调试模式下逐步执行代码时,Visual Studio最终将产生与以前相同的错误。否则一切正常。