DLL和exe里的malloc和free不能混用
来源:互联网 发布:程序员开发流程图 编辑:程序博客网 时间:2024/06/11 02:21
一个模块一个堆,一个线程一个栈。
dll里malloc的内存,在exe里free会出错。
CRT(C运行时期库)不是使用进程缺省的堆来实现malloc(new中调用malloc)的,而是使用一个全局句柄HANDLE _crtheap来分配内存的。这个_crtheap是在XXXCRTStartUp(CRT提供的进口点函数)中创建的。
由于CRT静态连接,则楼主的DLL里有也有一个CRT,因此也有一个_crtheap。而在dll中的new使用dll中的_crtheap句柄分配堆,在exe中的delete使用exe中的_crtheap释放堆,当然失败!
解决办法:
1。在DLL中输出一个函数给EXE调用,专门用来释放由DLL分配的内存;
2。用GlobalAlloc()代替new,用GlobalFree()代替delete;
3。使用单一的堆,分配内存使用HeapAlloc(GetProcessHeap(),0,size),释放内存使用HeapFree(GetProcessHeap(),0,p);
4。把dll和exe的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL;这样使用一个CRT了——MSVCRT.DLL。
以上这些函数必须要按类型配合使用(比如:new 申请的内存,则必须用 delete 释放)。在 COM 内部,当然你可以随便使用任何类型的内存分配释放函数,但组件如果需要与客户进行内存的交互,则必须使用上表中的后三类函数族。IMalloc 接口又是对 CoTaskXXX() 函数族的一个包装。包装后,同时增强了一些功能,比如:IMalloc::GetSize()可以取得尺寸,使用 IMallocSpy 可以监视内存的使用。
- DLL和exe里的malloc和free不能混用
- DLL和exe里的malloc和free不能混用
- DLL和exe里的malloc和free不能混用
- DLL和exe里的malloc和free不能混用
- DLL和exe里的malloc和free不能混用的问题
- DLL和exe里的malloc和free不能混用的问题
- DLL和exe里的malloc和free不能混用的问题
- malloc()和free()里的学问
- malloc和free的实现
- malloc和free的原理
- free和malloc的使用
- malloc和free的源代码
- malloc()和free()的原理
- malloc和free的问题
- free和malloc的用法
- malloc和free的原理
- malloc和free的原理
- malloc()和free()的原理
- Hibernate深入之get()与load()懒加载
- DM9000驱动理解二(挂起和恢复)
- linux tr命令详解
- as3.0向addEventListener 后面参数传值
- oracle ceil和floor函数
- DLL和exe里的malloc和free不能混用
- 以太网最大传输单元MTU
- TCP报文格式详解
- DirectShow SDK下载
- NSArray和NSMutableArray的常用方法
- linux之sed用法
- hibernte+mysql纯sql查询问题
- Visual Studio中最常用的13个快捷键
- PHP 中关于json二个函数