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
- dll里面分配的空间一定要在dll里面释放吗
- DLL分配的内存如何在EXE里面释放
- DLL分配的内存如何在EXE里面释放
- 在dll里面申请内存, 主程序释放导致AV
- Primary Interop Assemblies里面的dll部署时一定要注册
- vc++里面调试dll程序,在dll程序里面打断点,进入dll断点的方法
- 在进程空间释放注入的DLL
- 关于在主程序里面调用DLL时,找不到DLL里面的路径问题
- DLL 里面的 socket 编程
- 在ASP页里面注册你的DLL
- 在vc6里面创建dll,最基本的方法。
- 在vc6里面创建dll,最基本的方法。
- 在dll里面,不能使用全局的 thread
- 如何在VS2008里面调试DLL?
- 如何在unity3D里面引用dll
- DLL中内存的分配释放
- DLL里面socket
- User32.dll里面的__Clientxxx函数
- C语言常见错误提示(持续更新)!
- shell变量的作用域
- 数字整除
- Linux系统命令详解之ls
- Android 进阶学习:事件分发机制完全解析,带你从源码的角度彻底理解(上)
- dll里面分配的空间一定要在dll里面释放吗
- IOS程序发布到APP Store详细流程
- 11g自适应游标及statistics_level
- Windows如何压缩tar.gz格式
- .Net使用SSH.NET通过SSH访问Linux主机
- MATLAB金融工具箱(一)--快速入门
- USB架构浅谈
- 进程与线程的一个简单解释——图文类比
- DLL分配的内存如何在EXE里面释放