不同DLL中,分配和释放内存空间的有关问题

不同DLL中,分配和释放内存空间的问题。
这个问题有人问过,但是我还是不太清楚,所以我再问一下。

我的主程序调用了一个DLL的函数,分配了一段空间。当不需要这段空间的时候我就在主程序中释放掉它。但是出问题了,每次程序运行,执行了这段程序6次的时候就在释放的时候出错。

请问,为什么在DLL中分配的空间不能在主程序中释放?

(注:我在DLL中添加了个释放空间的函数解决了这个问题了,但是不明白上边这个问题。)

------解决方案--------------------
这个是显然的,你的DLL被制作成自身释放内存的就要DLL才能释放,因为DLL的调用是有被计数的,为了防止还有调用程序正在引用DLL,你不应该在程序中释放内存.

原则:谁负责分配,谁就必须负责释放。

所以在DLL中释放是正确的.

其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了,没问题,
比较规范点的做法一般是DLL分配的内存由DLL释放。在DLL中加一个函数释放内存不是更好吗。
------解决方案--------------------
跨模块释放内存出错可能有多种原因:
1、不同模块使用了不同的内存管理器
2、不同模块使用了不同的堆

最大的问题是一个模块可能完全不知道另一个模块是如何分配内存的。
------解决方案--------------------
模块之间分配和释放内存有一些不安全因素,因为不同模块(特别是不同语言开发的模块)可能使用了不同的内存管理机制,这种情况是不是跨模块释放的,所以VC的Debug版中对内存释放做了检查,如果发现不是本模块分配的就会报错。你可以在DLL中增加一个导出函数来释放内存。
------解决方案--------------------
不同的模块之间,它们的内存分配机制,很有可能不一致,这样由一个 模块去释放另一个模块的操作很不安全,所以需要避免,通过导出一个释放函数来解决
------解决方案--------------------
造成失败的原因是分配和释放内存不是由相同的堆管理程序完成的,例如动态链接库中的堆在默认情况下是由msvcrt.dll中的堆管理程序管理的 (以动态链接的方式),而exe程序的堆在默认情况下是由程序自己的代码管理(以静态链接的方式),由于它们的堆管理程序不同,当动态链接库分配的内存在 exe程序中释放时就会出错,因为exe程序所在的堆并没有分配这块内存,而你却要求它释放这块内存。
解决方法:将程序中所有的模块都链接到C/C++运行期库Multithreaded DLL,修改后所有分配和释放堆上内存的操作都由同一个堆管理程序管理,这样便解决了问题。