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

Throwing std::exception in CLI throws Access Violation

本文关键字:exception 访问冲突 std CLI      更新时间:2023-10-16

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

所以我把包含异常的头文件放在一个新的 CLI 项目中,并尝试编译它。这给了我一个错误,即"例外"不是 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();
    }

}

当代码抛出我的自定义异常时,我收到的异常:

还不能嵌入图片...

提前感谢,加尔文

编辑

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

我能够解决问题。

#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 最终会产生与以前相同的错误。否则一切正常。