gpt4 book ai didi

c++ - 为什么从 DLL 内部分配的内存在 FreeLibrary() 之后变得无效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:45 25 4
gpt4 key购买 nike

我今天遇到了这个错误,原来是因为我在调用 FreeLibrary() 后使用了一个字符串从我的 DLL 中分配

这是一个重现崩溃的简单示例。这进入 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 也消除了崩溃。

最佳答案

如果您选择与 MSVCRT(C 运行时)库的静态链接,您将获得您描述的行为。如果您的 EXE 和 DLL 动态链接到 MSVCRT DLL,但使用不同的版本,也会发生同样的事情。或者如果它们匹配到相同的版本,但一个使用 DEBUG,另一个使用 RETAIL。换句话说,内存仅与用于进行分配的 MSVCRTxxx.dll 的生命周期一样好。我刚刚看到您对问题的更新 - 是的,在 VS 2008 和 2010 之间混合和匹配 CRT 是崩溃的确切原因。

如果您的 DLL 和 EXE 都动态链接到 相同 版本的 MSVCRT DLL,那么您可以共享内存堆并避免您遇到的问题。

标准做法是:如果您导出的 DLL 函数返回任何需要稍后“释放”或“释放”的内容,那么标准做法是提供一个从 DLL 导出的附加函数来处理取消分配。

您可以从代码生成页面为项目中的 C/C++ 项目设置配置 EXE 和 DLL 的 C 运行时链接。

图片在这里:http://imgur.com/uld4KYF.png

关于c++ - 为什么从 DLL 内部分配的内存在 FreeLibrary() 之后变得无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300812/

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