C++ cli 使用clic++;在本机c++;带/MTd-CRT的exe 我有一个使用/MTD运行时库的本机C++ exe。我无法更改此选项,因为我无法控制此exe的生成。在这个EXE中,我需要调用CLI C++ + DLL,它返回具有STL向量成员变量的类。在CLI C++方法返回时,我得到堆损坏错误。根据我的分析,发生这种情况是因为有两个不同的CRT,并且由于地址无效,vectors deallocate方法正在本机CRT和bombs中运行 < >我如何返回一个CLI C++ + DLL的向量,它是用不同的CRT编译的,用我的原生exe?< /p> < p>您的评估是正确的。在一个CRT内执行的分配不能在不同的CRT内被释放。这是一条简单的规则,没有办法绕过它

C++ cli 使用clic++;在本机c++;带/MTd-CRT的exe 我有一个使用/MTD运行时库的本机C++ exe。我无法更改此选项,因为我无法控制此exe的生成。在这个EXE中,我需要调用CLI C++ + DLL,它返回具有STL向量成员变量的类。在CLI C++方法返回时,我得到堆损坏错误。根据我的分析,发生这种情况是因为有两个不同的CRT,并且由于地址无效,vectors deallocate方法正在本机CRT和bombs中运行 < >我如何返回一个CLI C++ + DLL的向量,它是用不同的CRT编译的,用我的原生exe?< /p> < p>您的评估是正确的。在一个CRT内执行的分配不能在不同的CRT内被释放。这是一条简单的规则,没有办法绕过它,c++-cli,msvcrt,crt,C++ Cli,Msvcrt,Crt,您需要使用相同的运行时库设置构建两个模块,或者只需要在模块边界之间传输POD类型。坏消息并不常见。我不会将此作为答案提交,但如果您非常绝望,并且类是通过指针而不是值返回的,在程序执行过程中,您确定只调用这个方法几次,那么您就不能简单地删除这个类。它会泄漏,但也许这是可以接受的。正如@ildjarn所指出的,真正的答案显然是修复应用程序配置。此外,无法保证矢量访问操作将来会在不同的CRT上工作。感谢ildjarn和David的回复。我现在已经用指针代替了向量。因为我知道大小,所以我正在创建原始向量

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

坏消息并不常见。我不会将此作为答案提交,但如果您非常绝望,并且类是通过指针而不是值返回的,在程序执行过程中,您确定只调用这个方法几次,那么您就不能简单地删除这个类。它会泄漏,但也许这是可以接受的。正如@ildjarn所指出的,真正的答案显然是修复应用程序配置。此外,无法保证矢量访问操作将来会在不同的CRT上工作。感谢ildjarn和David的回复。我现在已经用指针代替了向量。因为我知道大小,所以我正在创建原始向量成员的数组,并将它们跨dll边界传递。只是现在我需要非常小心,不要只在分配内存的地方释放内存。