dll里面分配的空间一定要在dll里面释放吗

关键看这个“申请空间”是怎么来的。

Windows下申请内存空间的方式很多,只要用对应的释放就可以了:
VirtualAlloc用VirtualFree,
CoTaskMemAlloc用CoTaskMemFree,
HeapAlloc用HeapFree,
GlobalAlloc用GlobalFree,
LocalAlloc用LocalFree,
等等……一套一套。
看到你给出的错误提示信息是_CrtIsValidHeapPointer(pUserData),
那么我认为你用的是C语言的malloc/free或C++的new/delete。
这两套函数比较特殊,不是系统提供的API,而是运行库自己实现的。
运行库有两种链接方式,静态链接和动态链接。
如果都使用动态链接方式并且链接到同一个版本的运行库,那么调用的malloc和free函数都是msvcrt.dll或者msvcrNNN.dll里的,这样的dll在一个进程里只有一个,也就是说用的malloc/free是同一套的,就不会有问题。
如果都使用的是动态链接方式但是链接的运行库版本不同,那么调用malloc/free的时候就有可能不配套,例如msvcrt.dll的malloc申请的内存拿到msvcr120.dll去释放,就有可能出问题。
如果都是用的是静态链接的方式,或者有的是动态链接有的是静态链接,那么调用的malloc/free也有可能不是同一套的,具体看你代码位置。dll里申请的空间到另一个dll或者exe里释放,用的就不是同一套函数,这样就可能出现错误。

为了确保能够正确释放,如果使用C语言运行库来申请/释放内存的话,提供一个释放接口是一个好想法。
如果是系统API申请、释放的内存,只要保证是同一套函数就可以了,不需要提供释放接口

我举几个例子:
dll里, p = HeapAlloc(GetProcessHeap(), 0, 10);;exe里 HeapFree(GetProcessHeap(), 0, p);
因为GetProcessHeap在同一个进程里返回的是同一个值,HeapAlloc和HeapFree又是系统API,所以这是没问题的。

dll里,p = malloc(1024);;exe里 free(p);。如果dll和exe都是动态链接到msvcrt.dll,那么相当于内存是从 msvcrt.dll 里来最后回到 msvcrt.dll 里去,那么是没有问题的。

还是前一个,如果dll是静态链接到 libcmt.lib 而exe是动态链接到 msvcrt.dll,那么相当于内存是从你这个dll里来, 回到 msvcrt.dll 里去,是不保证正确的。

还是这一个,如果dll和exe都是静态链接到 libcmt.lib,这种情况虽然静态链接到同一个库,但是内存也还是相当于从你的dll来,回到exe里去,也是不保证正确的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值