DLL和exe里的malloc和free不能混用

我们在进行VC++编程时可能会经常遇到下面这种提示:
其原因可能是堆被损坏,这说明**.exe中或它加载的任何DLL中有Bug

在网上搜了一下资料,如下说明:

一个模块一个堆,一个线程一个栈。
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。

  C语言 C++语言 Windows 平台 COM IMalloc 接口 BSTR
申请 malloc() new GlobalAlloc() CoTaskMemAlloc() Alloc() SysAllocString()
重新申请 realloc()   GlobalReAlloc() CoTaskRealloc() Realloc() SysReAllocString()
释放 free() delete GlobalFree() CoTaskMemFree() Free() SysFreeString()

  以上这些函数必须要按类型配合使用(比如:new 申请的内存,则必须用 delete 释放)。在 COM 内部,当然你可以随便使用任何类型的内存分配释放函数,但组件如果需要与客户进行内存的交互,则必须使用上表中的后三类函数族。IMalloc 接口又是对 CoTaskXXX() 函数族的一个包装。包装后,同时增强了一些功能,比如:IMalloc::GetSize()可以取得尺寸,使用 IMallocSpy 可以监视内存的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mallocfreeC语言用于动态内存分配和释放的函数。 malloc函数用于在内存分配一块指定大小的内存块,并返回指向该内存块的指针。它接受一个参数,即所需的内存字节数。通过malloc函数,我们可以动态地分配内存,根据需要来分配内存空间。例如,可以使用malloc来创建动态数组。格式如下:a = (int*)malloc(number * sizeof(int))。 free函数用于释放之前通过malloc函数分配的内存。它的参数是之前malloc返回的地址。通过调用free函数,我们可以将内存归还给内存池,为下一次使用这些内存做准备。 当内存空间用完时,调用malloc函数可能会失败,返回NULL值。此时,需要合理地处理内存分配失败的情况,以避免程序出现错误。 需要注意的是,在使用mallocfree函数之前,需要包含头文件#include<stdlib.h>,以确保这两个函数的声明被正确引用。 举个例子,下面是两段代码示例: #include <stdio.h> #include <stdlib.h> int main() { int *a; a = (int*)malloc(10 * sizeof(int)); if (a == NULL) { printf("内存分配失败\n"); return 1; } // 使用分配的内存 // ... free(a); return 0; } #include <stdio.h> #include <stdlib.h> int main() { void *p; p = malloc(666); if (p == NULL) { printf("内存分配失败\n"); return 1; } // 使用分配的内存 // ... free(p); return 0; } 以上是关于mallocfree函数的基本介绍和使用方法。它们在C语言提供了一种灵活管理内存的方式,可以动态地分配和释放内存空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值