我今天遇到了这个错误,原来是因为我在调用FreeLibrary()
.
这是一个重现崩溃的简单示例。这在 DLL 中:
void dllFunc(char **output)
{
*output = strdup("Hello"); // strdup uses malloc
}
这是在加载 DLL 的 EXE 中:
void exeFunc()
{
char *output;
dllFunc(&output);
std::string s1 = output; // This succeeds.
FreeLibrary(dll);
std::string s2 = output; // This crashes with access violation.
}
我阅读了文档,FreeLibrary()
但在调用内存后我找不到任何关于内存变得无效的信息。
编辑
我刚刚意识到我一直在为 DLL 使用 VS2008 工具链,而为 EXE 使用 VS2010 工具链(我将 VS2010 用作两者的 IDE,但您可以从项目设置中选择工具链)。将 DLL 的工具链设置为 VS2010 也消除了崩溃。