gpt4 book ai didi

c++ - Release模式工作正常但 Debug模式给出未处理的异常 - 使用 Octave DLL

转载 作者:太空宇宙 更新时间:2023-11-04 15:39:55 25 4
gpt4 key购买 nike

Release模式工作正常但 Debug模式给了我这个:

Executable_to_LinkDLL_to_FDDDLL.exe 中 0x0fc5edac (msvcr90d.dll) 的未处理异常:0xC0000005:访问冲突写入位置 0xbaadf00d。

我正在使用 Octave 发布的 DLL。异常如下所示。我想知道是否有人遇到过这个问题。

enter image description here

enter image description here

enter image description here

这是我的代码中发生错误的地方(基于以下调用堆栈):

Here is where error happens in my code

enter image description here

最佳答案

查看 string_vector 的 Octave 文档,使用了对 std::string 的引用。这意味着需要为您正在开发的编译器和设置构建 Octave 库。

原因是像 std::string 这样的类不需要与另一个版本的 std::string 二进制兼容。当您在调试版本中使用发布版本时,std::string 的内部结构在发布版本和调试版本中是不同的。

但是,即使 std::string 的版本是二进制兼容的,您也需要确保 Octave DLL 和您的应用程序使用相同的运行时堆。原因是 std::string 使用动态分配的内存,并且必须为 DLL 和应用程序使用相同的堆。为确保这一点,必须使用 Visual Studio 运行时库的 DLL 版本(必须为 DLL 运行时的发布或调试版本设置 /MD/MDd 编译器标志,分别)。

所以你有两个问题:

  1. Octave DLL 和您的应用程序之间 std::string 版本之间的二进制兼容性,以及

  2. 确保 DLL 和应用程序构建为使用运行时库的 DLL 版本,以确保使用相同的内存堆。

您使用 char * 的解决方案仅避免传递 std::string 引用和对象。我不知道这个解决方案有多可靠,因为看起来很容易出错并在某个时候调用 std::string 函数。

我只会确保在开发和部署您的应用程序时使用正确的 DLL。这正是 Microsoft 对其 DLL 所做的——您不能在您的应用程序中混合和匹配 Microsoft DLL 的发布和调试版本,因此这同样适用于此。唯一可以混合/匹配发布和调试 DLL 的情况是 DLL 仅使用“简单”类型(例如 DWORD、LONG、TSTR 等)或指向这些类型的参数和返回值的指针。

关于c++ - Release模式工作正常但 Debug模式给出未处理的异常 - 使用 Octave DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com