gpt4 book ai didi

c++ - 释放在不同 DLL 中分配的内存

转载 作者:可可西里 更新时间:2023-11-01 16:26:11 29 4
gpt4 key购买 nike

我有一个使用 DLL 文件的 EXE 文件,该 DLL 文件正在使用另一个 DLL 文件。出现了这种情况:

在 DLL 文件 1 中:

class abc
{
static bool FindSubFolders(const std::string & sFolderToCheck,
std::vector< std::string > & vecSubFoldersFound);
}

在 DLL 文件 2 中:

void aFunction()
{
std::vector<std::string> folders;
std::string sLocation;
...
abc::FindSubFolders(sLocation, folders)
}

在 Release模式下,一切正常。但是在 Debug模式下,我在文件夹 vector 中的 std::strings 之一的析构函数中遇到断言失败(当文件夹在 aFunction 结束时超出范围时):

dbgheap.c:第 1274 行

/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));

我假设这是因为内存已分配到 DLL 文件 1 的堆上,但正在 DLL 文件 2 中释放。

dbgheap.c 中的注释似乎坚持认为这是一个问题。

为什么这是一个这样的问题,如果我忽略它似乎工作正常?是否有一种非断言失败的方式来做到这一点?

最佳答案

正如 sean 已经说过的那样,发布版本只是简单地忽略了删除语句,因此您最多只能希望出现内存泄漏。

如果您可以控制两个 DLL 文件的编译方式,请确保对运行时库使用多线程调试 DLL (/MDd) 或多线程 DLL (/MD) 设置。这样,两个 DLL 文件将使用相同的运行时系统并共享相同的堆。

缺点是您需要将运行时系统与您的应用程序一起安装(Microsoft 为此提供了一个安装程序)。它在您的开发机器上可以正常工作,因为 Visual Studio 也会安装该运行时系统,但在新安装的机器上它会报告缺少 DLL 文件。

关于c++ - 释放在不同 DLL 中分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634773/

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