c/c++运行期库的使用

本次介绍关于c/c++运行库的一些重要的内容
很多人在使用malloc,free函数时,会经常出现内存错误
比如下面的源码

void ExeFunc()
{
    PVOID pv=DLLFunc();
    free(pv);
}

PVOID DLLFunc()//这个函数的源代码在DLL中
{
    return malloc(100);
}

那么这个代码能够正常运行吗?答案是不确定
1.假如exe链接的是动态运行库,dll链接的也是动态运行库,那么这个代码是可以正常运行的
2 如果exe和dll链接的库不同,那么,这个代码不能正常运行
3 如果exe和dll链接的都是静态的,那么这个代码也不能正常运行

我们说说为什么
一个进程的所有线程共享一个堆
malloc和free都是从堆上分配空间,如果malloc和free不是同一个堆,自然会出错
假如exe和dll链接的都是c/c++运行期库的动态库,那么没关系,因为他们共用一个dll,所以堆是相同的,自然没问题
假如exe和dll链接的库不一样,链接静态库的那个使用的是自己的堆,链接动态库的那个使用的是dll的堆,堆不一样,肯定有问题
假如exe和dll链接的是相同的静态库,静态库就是把运行库的代码完全加载到各自的模块中,也就是,他们使用的是自己的堆,也就是说exe使用的是exe的堆,dll使用的是dll的堆,堆也不一样,自然会有问题

正确的做法是谁分配谁释放,只要分配和释放在同一个堆中就没有问题

void ExeFunc()
{
    PVOID pv=DLLFunc();
    DLLFreeFunc(pv);
}

PVOID DLLFunc()//这个函数的源代码在DLL中
{
    return malloc(100);
}

BOOL DLLFreeFunc(PVOID pv)
{
    return (free(pv));
}

这样不管什么情况下都不会出问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值