深究跨dll的资源分配和释放问题
2015-05-25 09:54
190 查看
一直都在说stl库最好不要跨模块传递,因为以前没有遇到过类似的问题,所以一直都没有仔细研究过为什么,最近写了一个代码,遇到这个问题了,我们就来研究一下
是下面类似代码出的问题:
//a.dll
std::string a; //在a.dll里面分配的内存
AddString(a); //这是调用b.dll里面的函数
//b.dll
void AddString(string& val)
{
val += "test";
//这是在b.dll里面的函数,因为+=一般会动态增长内存,所以这里的内存是在b.dll里面分配的
}
我们来把问题简化一下,我们看看new函数到底干了什么,跟踪进去之后可以看到有这么一个代码,进行内存分配(下面的代码去掉次要的,只有我们需要的代码)
__forceinline void * __cdecl _heap_alloc (size_t size)
{
return HeapAlloc(_crtheap, 0, size ? size : 1); //这里调用api在_crtheap上分配内存
}
那么上面的_crtheap是哪里来的呐,我们来看下真正的dll入口函数_DllMainCRTStartup(在这个函数里面会调用DllMain,但是除此之外还完成了全局变量初始化之类的工作,同时也完成了这里要说到的内存管理),检查下汇编代码,就会发现实际的dll入口是在DllMainCRTStartup,里面有个函数_heap_init,里面
if ( (_crtheap = HeapCreate( mtflag ? 0 : HEAP_NO_SERIALIZE,
BYTES_PER_PAGE, 0 )) == NULL )
大家看到了,_crtheap登场了,那么可以理解了,new和delete操作都是和模块相关的,每个模块都会管理自己的堆,如果跨模块的话,就会导致堆内存管理的混乱,出错再所难免了.解决的办法可以动态连接crt库,这样管理new和delete都在同一个堆里(因为动态连接,代码都会在crt的dll里面执行,当然不会有堆内存的问题),不会出任何问题.还可以利用虚函数技术,反正都是为了保证资源的分配和释放不能在不同模块里面,这个上vc++的crt决定的,没有研究过其它IDE的crt,不知道是否也有类似的问题,over
是下面类似代码出的问题:
//a.dll
std::string a; //在a.dll里面分配的内存
AddString(a); //这是调用b.dll里面的函数
//b.dll
void AddString(string& val)
{
val += "test";
//这是在b.dll里面的函数,因为+=一般会动态增长内存,所以这里的内存是在b.dll里面分配的
}
我们来把问题简化一下,我们看看new函数到底干了什么,跟踪进去之后可以看到有这么一个代码,进行内存分配(下面的代码去掉次要的,只有我们需要的代码)
__forceinline void * __cdecl _heap_alloc (size_t size)
{
return HeapAlloc(_crtheap, 0, size ? size : 1); //这里调用api在_crtheap上分配内存
}
那么上面的_crtheap是哪里来的呐,我们来看下真正的dll入口函数_DllMainCRTStartup(在这个函数里面会调用DllMain,但是除此之外还完成了全局变量初始化之类的工作,同时也完成了这里要说到的内存管理),检查下汇编代码,就会发现实际的dll入口是在DllMainCRTStartup,里面有个函数_heap_init,里面
if ( (_crtheap = HeapCreate( mtflag ? 0 : HEAP_NO_SERIALIZE,
BYTES_PER_PAGE, 0 )) == NULL )
大家看到了,_crtheap登场了,那么可以理解了,new和delete操作都是和模块相关的,每个模块都会管理自己的堆,如果跨模块的话,就会导致堆内存管理的混乱,出错再所难免了.解决的办法可以动态连接crt库,这样管理new和delete都在同一个堆里(因为动态连接,代码都会在crt的dll里面执行,当然不会有堆内存的问题),不会出任何问题.还可以利用虚函数技术,反正都是为了保证资源的分配和释放不能在不同模块里面,这个上vc++的crt决定的,没有研究过其它IDE的crt,不知道是否也有类似的问题,over
相关文章推荐
- 深究跨dll的资源分配和释放问题
- C#嵌入dll到资源释放的问题
- Dll分配的内存块,应用释放的问题
- 转载:Dll分配的内存块,应用释放的问题
- C#嵌入dll到资源释放的问题
- 跨DLL的内存分配释放问题 Heap corruption
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- C++嵌入DLL到资源运行释放的问题
- C#嵌入dll到资源释放的问题
- Dll分配的内存块,应用释放的问题
- 【百度分享】频繁分配释放内存导致的性能问题的分析
- 频繁分配释放内存导致的性能问题的分析
- 动态分配资源的自动释放 – auto_ptr的实现原理
- Win32 API资源分配释放速查
- 频繁分配释放内存导致的性能问题的分析
- C#释放资源文件dll