![]() |
1
14
正如sean已经说过的,发布版本只是忽略了delete语句,所以最好的希望是内存泄漏。 如果您可以控制如何编译这两个DLL文件,请确保对运行库使用多线程调试DLL(/MDd)或多线程DLL(/MD)设置。这样,两个DLL文件将使用相同的运行时系统并共享相同的堆。 缺点是您需要将运行时系统与应用程序一起安装(Microsoft为此提供了安装程序)。由于VisualStudio也安装了运行时系统,所以它在您的开发机器上可以正常工作,但在新安装的机器上,它会报告缺少的DLL文件。 |
![]() |
2
8
最有可能的是,发布版本也有同样的问题,但是发布版本不会断言。他们只是忽视了这个问题。你可能永远看不到问题。或者您可能会看到数据损坏。或者你可能会看到撞车。也许只有你的用户会遇到你根本无法复制的bug。
您应该始终使用适当的deallocator(与最初使用的分配器匹配的deallocator)。如果在DLL文件中使用静态CRT库,则DLL文件使用不同的堆。不能跨堆释放内存。使用同一堆分配和取消分配内存块。 如果您在DLL文件中使用共享CRT库,那么它们应该使用相同的堆,您可以在一个DLL文件中分配,在另一个DLL文件中取消分配。 |
![]() |
3
7
正如其他人所说,这个问题可以通过确保CRT在两个模块之间共享来解决。但在一些常见的情况下,该合同很难执行。 原因是,如果EXE和DLL没有链接到同一个CRT,那么确保链接到共享CRT将不起作用 版本 (如6.0、7.0、8.0)。例如,如果您使用VC6.0中构建的DLL,并尝试将其与VS2010中的EXE构建一起使用,您将遇到与以前相同的问题。CRT的两个版本将加载到您的进程中,并且每个版本都使用自己的堆进行分配,无论您的EXE和DLL是否使用“共享”CRT,它们都将不相同。
|
![]() |
4
5
只有当应用程序或一个(或多个)DLL文件链接到标准库的静态版本时,才会出现此问题。大约十年前,微软发布了标准库的共享库版本,解决了这个问题。这是因为标准库的每个版本都将构建自己的内部堆,因此对于多个堆,您必须将内存释放到正确的堆中。通过使用标准库的共享版本,它们都使用相同的堆。 这是目前应用程序的标准做法,所有DLL文件都应使用标准库的动态版本构建。
|
|
Guilherme Albertini · DLL中的类 6 年前 |
![]() |
Naomi · C#dll资源文件更改语言 6 年前 |
![]() |
AidanH · C#DLL语言翻译实现[关闭] 6 年前 |
![]() |
subham · DLL函数调用不工作 6 年前 |
![]() |
PixelThis · 为什么我的DLL要求我的程序有一个特定的名称? 6 年前 |
![]() |
nemo · DLL的“好”调用约定是什么? 6 年前 |