进程调用DLL分配内存函数,进程释放内存,错误说明。(复制于Windows核心编程)

DLL与进程的地址空间

注意必须注意的是,单个地址空间是由一个可执行模块和若干个D L L模块组成的。这些模块中,有些可以链接到静态版本的C / C + +运行期库,有些可以链接到一个D L L版本的C / C + +运行期库,而有些模块(如果不是用C / C + +编写的话)则根本不需要C / C + +运行期库。许多开发人员经常会犯一个常见的错误,因为他们忘记了若干个C / C + +运行期库可以存在于单个地址空间中。请看下面的代码:

 

VOID EXEFunc()
{ 
   PVOID pv = DLLFunc(); 
   //Access the storage pointed to by pv... 
   //Assumes that pv is in EXE's C/C++ run-time heap 
   free(pv);
} 
 
PVOID DLLFunc()
{ 
   //Allocate block from DLL's C/C++ run-time heap 
   return(malloc(100)); 
} 

那么你是怎么看待这个问题的呢?上面这个代码能够正确运行吗? D L L函数分配的内存块是由E X E的函数释放的吗?答案是可能的。上面显示的代码并没有为你提供足够的信息。如果E X E和D L L都链接到D L L的C / C + +运行期库,那么上面的代码将能够很好地运行。但是,如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,那么对free函数的调用就会失败。我经常看到编程人员编写这样的代码,结果都失败了。

有一个很方便的方法可以解决这个问题。当一个模块提供一个用于分配内存块的函数时,该模块也必须提供释放内存的函数。让我们将上面的代码改写成下面的样子:

 

VOID EXEFunc()
{ 
   PVOID pv = DLLFunc(); 
   //Access the storage pointed to by pv... 
   //Makes no assumptions about C/C++ run-time heap
   DLLFreeFunc(pv); 
} 
 
PVOID DLLFunc()
{ 
   //Allocate block from DLL's C/C++ run-time heap 
   PVOID pv = malloc(100); 
   return(pv); 
} 
 
BOOL DLLFreeFunc(PVOID pv) 
{ 
   //Free block from DLL's C/C++ run-time heap 
   return(free(pv));       
}

这个代码是正确的,它始终都能正确地运行。当你编写一个模块时,不要忘记其他模块中的函数也许没有使用C / C + +来编写,因此可能无法使用m a l l o c和f r e e函数进行内存的分配。应该注意不要在代码中使用这些假设条件。另外,在内部调用m a l l o c和f r e e函数时,这个原则对于C + +的n e w和d e l e t e操作符也是适用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值