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

来源:互联网 发布:淘宝集市店怎样注册 编辑:程序博客网 时间:2024/05/16 14:36
关键看这个“申请空间”是怎么来的。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里去,也是不保证正确的。
0 0
原创粉丝点击