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));
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章