【问题标题】:Trying to delete c# array in c++ dll. Getting System.AccessViolationException试图在 c++ dll 中删除 c# 数组。获取 System.AccessViolationException
【发布时间】:2021-10-24 06:32:47
【问题描述】:

我一直在使用自定义 C++ DLL,但在删除使用 [DLLImport] 从 C# 传递的 C++ 中的数组时遇到问题。当它运行时,它给了我异常 System.AccessViolationException。

非常感谢任何帮助。

__declspec(dllexport) void empty(Game* x[], int y)
    {
        try
        {
            delete x[y];
        }
        catch (const std::exception& exc)
        {
            // catch anything thrown within try block that derives from std::exception
            ExceptionOutput << exc.what();
        }
    }

【问题讨论】:

  • 只有创建数组的 dll 才能删除它。
  • 标准 C++ 的内存管理与 C# 非常不同。如果 C# 创建了您要删除的对象,C++ 可能没有来自它自己的 freestore 的记录,并且不知道如何将其放回原处。您可能需要提供一个 C++ 代码可以调用的函数来释放它。
  • show minimal reproducible example 这样我们就可以看到所有必要的代码,因为这些代码并不是孤立存在的

标签: c# c++ exception dll dllimport


【解决方案1】:

在这种情况下,C++ 和 C# 代码将具有不同的堆,并且不可能在一个部分分配数据并在另一部分释放数据。如果数组是在 C# 代码中创建的,则应该在 C# 代码中释放它 - 基本上 C# 代码拥有该数据,并负责重新分配该数据。

如果在您的情况下,C++ 代码更清楚何时释放内存,则值得在 C# 代码中创建一个函数并将其导出为 C++ 代码,该代码将在需要时调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 2020-06-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多