我在通过引用传递 std::string 以在 dll 中运行时遇到问题。
这是函数调用:
CAFC AFCArchive;
std::string sSSS = std::string("data\\gtasa.afc");
AFCER_PRINT_RET(AFCArchive.OpenArchive(sSSS.c_str()));
//AFCER_PRINT_RET(AFCArchive.OpenArchive(sSSS));
//AFCER_PRINT_RET(AFCArchive.OpenArchive("data\\gtasa.afc"));
这是函数头:
#define AFCLIBDLL_API __declspec(dllimport)
AFCLIBDLL_API EAFCErrors CAFC::OpenArchive(std::string const &_sFileName);
我尝试通过调用函数逐步调试并查看函数内部的 _sFileName
值。
_sFileName
在函数中设置任何值(例如,t4gs..\n\t
)。
我尝试检测任何堆损坏,但编译器说没有错误。
DLL 已在调试设置中编译。 .exe 程序也在调试中编译。
怎么了??帮助..!
附言我使用的是 Visual Studio 2013.WinApp。
编辑
我已将 func 的 header 更改为此代码:
AFCLIBDLL_API EAFCErrors CAFC::CreateArchive(char const *const _pArchiveName)
{
std::string _sArchiveName(_pArchiveName);
...
我真的不知道,如何修复这个错误...
关于堆:它是在我们进程的虚拟内存中分配的,对吧?在这种情况下,共享虚拟内存很常见。
最佳答案
这个问题与 STL 无关,而与跨应用程序边界传递对象有关。
1) DLL 和 EXE 必须使用相同的项目设置进行编译。您必须这样做,以便结构对齐和打包相同,成员和成员函数没有不同的行为,更微妙的是,引用和引用参数的低级实现完全相同。
2) DLL 和 EXE 必须使用相同的运行时堆。为此,您必须使用运行时库的 DLL 版本。
如果您创建一个与 std::string
做类似事情(在内存管理方面)的类,您会遇到同样的问题。
内存损坏的原因可能是有问题的对象(在本例中为 std::string
)分配和管理动态分配的内存。如果应用程序使用一个堆,而 DLL 使用另一个堆,如果您在 DLL 中实例化 std::string
,但是应用程序正在调整字符串的大小(意思是可能会发生内存分配)?
关于C++ 通过引用 dll 中的函数传递 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22279052/