malloc free失败

今天遇到C语言的malloc free失败问题,因为工程代码量巨大,定位了半天才发现是DLL的问题,动态链接库里malloc分配的内存,到主程序中free时崩溃失败。起初以为是指针越界好或被修改,后来直接改成申请后就free,直接失败,于是就怀疑是DLL与主程序之间的调用问题。于是总结一下常见失败问题方便后来者参考。

一、指针未初始化就free失败

该free错误非常容易定位,也就是一个指针没有成功执行malloc分配,就直接free肯定会失败,因为该指针还未经过初始化。例如:

1void main() {
2int* pBuf = NULL;
3free(pBuf);
4}

二、指针申请后被修改再free会失败

这个free错误则不好查找,因为实际的程序往往没下面的例子这么简单,可能从申请到最后释放跨域多个模块、大量的处理代码逻辑,指针初始值被修改掉,也就是说分配的这段内存的“门牌号”被改掉了,那么free就会失败。

1void main() {
2int* pBuf = (int*)malloc(250);
3pBuf++;
4free(pBuf);
5}

三、主程序与DLL混用malloc和free

模块之间的分配和释放分离设计,从设计上就是有问题的(至少天缘是如此认为),一般对于此类分享,最好使用共享内存方式,也就是说,分配和释放均由同一方管理,尽管我们有办法让他们实现分配和释放任务分离。

解决办法:

1、如果可以改成LIB库进行静态链接,可以改成LIB调用方式。

2、如果坚持使用DLL调用,可以考虑给DLL里添加一个专门用于释放该内存的函数,以便主程序调用。

3、使用可在全局堆分配内存的函数(比如HeapAlloc(GetProcessHeap(),0,size)、HeapFree(GetProcessHeap(),0,p)等等),不过不建议使用,最好还是从架构上调整一下。

四、主程序和链接库的运行时库设置不同也会引起malloc和free失败问题

比如主程序Project->Setting->C/C++的Use Run-time liberary设置为Debug Multithreaded DLL,而模块的User Run-time liberary设置为Debug Multithreaded的话,主程序调用释放free 通过DLL malloc的指针就会失败,其实这时,如果继续运行的话,delete DLL生成对象也是失败的。但是统一成Debug Multithreaded DLL就没有问题。具体可参考:error LNK2005: "public: void __thiscall 一文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值