一般是哪里申请哪里释放,谁申请的内存由谁释放,这是封装的基本原则。
dll内部(对外隐藏)的内存分配,显然要dll自己处理啦。当然也可以由调用它的程序释放, 但不推荐,高内聚,且不安全
dll外部的由外部程序分配后传进dll,使用完后,可以由外部程序释放,也可以调用dll内部函数帮助释放。
如果导出的是类,则可以在类中定义自我是释放的Release导出函数:
void release()
{
delete this;
}
COM的内存释放就是采用这样的方法
[ 知识点 ]
选摘 << WINDOWS核心编程>> 第19章 dll基础
创建dll常常比创建应用程序更容易,因为dll往往包含一组应用程序可以使用的自主函
数。在dll中通常没有用来处理消息循环或创建窗口的支持代码。dll只是一组源代码模块,
每个模块包含了应用程序(可执行文件)或另一个dll将要调用的一组函数。当所有源代码文
件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。但是,对于一个dll来说,
你必须设定该连链程序的/ dll开关。这个开关使得链接程序能够向产生的dll文件映像发出
稍有不同的信息,这样,操作系统加载程序就能将该文件映像视为一个dll而不是应用程序。
在应用程序(或另一个dll)能够调用dll中的函数之前,dll文件映像必须被映射到调
用进程的地址空间中。若要进行这项操作,可以使用两种方法中的一种,即加载时的隐含链接
或运行期的显式链接。
一旦dll的文件映像被映射到调用进程的地址空间中, dll的函数就可以供进程中运行的
所有线程使用。实际上, dll几乎将失去它作为dll的全部特征。对于进程中的线程来说,
dll的代码和数据看上去就像恰巧是在进程的地址空间中的额外代码和数据一样。当一个线程
调用dll函数时,该dll函数要查看线程的堆栈,以便检索它传递的参数,并将线程的堆栈用
于它需要的任何局部变量。此外, dll中函数的代码创建的任何对象均由调用线程所拥有,而
dll本身从来不拥有任何东西。
例如,如果VirtualAlloc函数被dll中的一个函数调用,那么将从调用线程的进程地址空间
中保留一个地址空间的区域,该地址空间区域将始终处于保留状态,因为系统并不跟踪dll中
的函数保留该区域的情况。保留区域由进程所拥有,只有在线程调用VirtualFree函数或者进程
终止运行时才被释放。