【问题标题】:Using CLI C++ dll with /MDd CRT in a native c++ exe with /MTd CRT在带有 /MTd CRT 的本机 c++ exe 中使用带有 /MDd CRT 的 CLI C++ dll
【发布时间】:2011-06-08 10:27:54
【问题描述】:

我有一个使用 /MTd 运行时库的本机 c++ exe。我无法更改此选项,因为我对此 exe 的构建没有太多控制权。我需要在这个 exe 中调用一个 CLI C++ dll,它返回一个带有 STL 向量成员变量的类。在 CLI C++ 方法返回时,我得到一个堆损坏错误。根据我的分析,发生这种情况是因为有两个不同的 CRT,并且向量解除分配方法在本机 CRT 中运行,并且由于地址无效而导致炸弹。

如何从使用不同 CRT 编译的 CLI C++ dll 返回向量以与我的本机 exe 一起运行?

【问题讨论】:

    标签: c++-cli msvcrt crt


    【解决方案1】:

    您的评估是正确的——在一个 CRT 内执行的分配不能在另一个 CRT 内解除分配。这是一条简单的规则,没有办法绕过它。

    您需要使用相同的运行时库设置构建两个模块,或者您只需要在模块边界之间传输 POD 类型。

    【讨论】:

    • 坏消息不常被人欣赏。
    • 我不打算提交这个作为答案,但是如果你很绝望并且类是通过指针而不是值返回的,并且你肯定只在期间调用这个方法几次程序执行,那么你不能简单地删除该类。它会泄漏,但也许这是可以接受的。正如@ildjarn 指出的那样,真正的答案显然是修复您的应用程序配置。此外,不能保证向量访问操作将来会在不同的 CRT 上工作。
    • 感谢 ildjarn 和 David 的回复。我现在用指针替换了向量。因为我知道大小,所以我正在创建原始向量成员的数组并将它们传递到 dll 边界。只是现在我需要非常小心地只在分配内存的地方释放内存。
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多