gpt4 book ai didi

c - FreeLibrary 在 VC14 上泄漏,但在 VC9 上没有泄漏

转载 作者:行者123 更新时间:2023-11-30 16:45:03 26 4
gpt4 key购买 nike

我使用的第三方库显然存在内存泄漏,这是我们在从 Visual Studio 2008 (VC9.0) 升级到 Visual Studio 2015 (VC14.0) 时首次发现的。在 Windows 上,我在运行时使用 LoadLibrary 加载库,使用完毕后,我使用 FreeLibrary 卸载它。当使用 VC9.0 进行编译和链接时,库分配的所有内存都会在 FreeLibrary 上被释放,而使用 VC14.0 时,某些内存永远不会被释放。下面是我的测试程序的内存配置文件:http://imgur.com/a/Hmn1S .

为什么 VC9.0 和 VC14.0 的行为不同?是否可以在不更改库源的情况下采取任何措施来避免泄漏,例如模仿 VC9.0 的行为?

我在这里唯一能找到的是:Memory leaks on DLL unload尽管一个答案暗示了一些黑客解决方案,但这并没有真正帮助我。

<小时/>

我做了一个最小的工作示例来表明它不是特定于该库的。首先,我用 C 创建一个小型库,其中的函数分配一些内存并且从不释放它:

leaklib.h:

#ifndef LEAKLIB_H_
#define LEAKLIB_H_

__declspec( dllexport ) void leak_memory(int memory_size);

#endif

leaklib.c:

#include "leaklib.h"

#include <stdio.h>
#include <stdlib.h>

void leak_memory(int memory_size)
{
double * buffer;
buffer = (double *) malloc(memory_size);
if (buffer != NULL)
{
printf("Allocated %d bytes of memory\n", memory_size);
}
}

然后一个程序加载该库,调用内存泄漏函数,然后再次卸载该库 - 如此反复,以便我们可以跟踪一段时间内的内存情况。

memleak.c:

#include <windows.h>
#include <stdio.h>

int main(void)
{
int i;
HINSTANCE handle;
int load_success;
void (*leak_memory)(int);
int dll_unloaded;

Sleep(30000);

for (i = 0; i < 100; ++i)
{
handle = LoadLibrary(TEXT("leaklib.dll"));

leak_memory = GetProcAddress(handle, "leak_memory");

printf("%d: leaking memory...\n", i);
leak_memory(50*1024*1024);
printf("ok\n\n");

Sleep(3000);

dll_unloaded = FreeLibrary(handle);
if (!dll_unloaded)
{
printf("Could not free dll'");
return 1;
}

Sleep(3000);
}

return 0;
}

然后我使用以下方法构建库:

cl.exe /MTd /LD leaklib.c

以及程序

cl.exe memleak.c

使用 VS9.0 或 VS14.0 中的 cl.exe。

最佳答案

真正的问题是 VC9 无意中释放了合理的程序可能期望仍然存在的内存 - 毕竟,free() 没有被调用。当然,这是 CRT 无法让所有人满意的领域之一 - 您需要自动的免费行为。

其背后的事实是,FreeLibrary 是一个非常简单的 Win32 函数。它从您的地址空间中删除一 block 代码。您可能会得到一些对 DllMain 的最终调用,但正如 DllMain 的文档所述:您不能在那里做太多事情。特别困难的一件事是弄清楚除了 DLL 的代码和数据段之外还需要释放哪些内存。

关于c - FreeLibrary 在 VC14 上泄漏,但在 VC9 上没有泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44244806/

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