一直都在说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

深究跨dll的资源分配和释放问题相关推荐

  1. 关于跨dll的模板单例问题

    C++的模板可以帮助我们编写适合不同类型的模板类,给代码的复用性提供了极大的方便.近来写了一个涉及单例的C++模板类,简化下来可以归结为以下的代码: 1 2 3 4 5 6 7 8 9 10 11 t ...

  2. 转:跨dll操作fopen的返回值导致出错

    从老板的blog那里抄来的,一个很神奇的bug,雷死: 源地址http://www.cnblogs.com/len3d/p/3406294.html 在设置成/MD 或 /MDd 不会导致出错 设置成 ...

  3. VC资源分配、释放表

    资源 分配函数 清除函数 需要手动清除?================================================================================ ...

  4. crt 运行时库dll跨模块传递crt对象,出现的崩溃问题

    参考链接: https://blog.csdn.net/weixin_30653097/article/details/96512399 (讲述了,运行时库在启动的时候在exe或dll入口点之前就使用 ...

  5. Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo

    1.新建Dll工程 2.Dll工程全部代码 library SubMain;{ Important note about DLL memory management: ShareMem must be ...

  6. [笔记]Windows核心编程《十九》DLL基础

    系列文章目录 [笔记]Windows核心编程<一>错误处理.字符编码 [笔记]Windows核心编程<二>内核对象 [笔记]Windows核心编程<三>进程 [笔记 ...

  7. 跨桌面端之组件化实践

    本文主要介绍了千牛PC跨端框架中,我们关于组件化部分的思考.方案选择.遇到的一些问题和解法. 此文为本系列文章第三篇, 第一篇:跨全端SDK技术演进 第二篇:跨桌面端之Web容器演进 本文:跨桌面端之 ...

  8. C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针

     C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针 在这个系列的"C#调用C++DLL的小总结6---C++Dll中指针的释放问题 "中曾经详细说过类似的问 ...

  9. 星淘惠:做跨境电商为什么要选择亚马逊?

    我们先来浅谈一下跨境电商的现状:疫情之后,消费者消费习惯转变,国外消费者转向线上消费,跨境市场购买力进一步释放,市场环境,跨境电商平台也在走向开放成熟.前期不稳定的政策因素经过调整后,也逐渐明晰起来. ...

最新文章

  1. 查看Linux进程CPU过高具体的线程堆栈(不中断程序)
  2. Web笔记——Filter过滤器
  3. C语言系列文章之#和##
  4. oracle组合数据类型,oracle复合数据类型-相关方法
  5. 让这三个月来的更猛烈些吧,前端react同构项目
  6. java wait 参数_Java Object wait()方法
  7. 华为集齐 AI 龙珠,“召唤神龙”为期不远
  8. 301与302页面重定向
  9. 评委输入的密码如果不正确,当错误的次数达到5次时,该评委的账号会被锁定.如何解锁呢?
  10. 学习笔记之深度学习(Deep Learning)
  11. 临时邮箱获取验证信息
  12. 汉诺塔递归算法python详细解析图_汉诺塔递归算法分析过程
  13. 公司电脑策略强制自动锁屏解决方案
  14. Ubuntu 压缩多个vmdk文件
  15. 如何在支付宝开直播,这篇入驻教程不要错过,看完你就会了
  16. word文档被覆盖了怎么恢复原状
  17. 甘肃省定西市谷歌卫星地图下载
  18. 十分钟入门Pandas
  19. 关于斐讯K2路由器 j.s9w.cc 劫持的问题。
  20. Multisim10.0 软件安装教程

热门文章

  1. STM32-APDS9960手势识别
  2. 研发组织该如何设计绩效体系?
  3. postgresql age
  4. Spark任务执行流程
  5. win环境下c语言02
  6. p2020开发_10个使您在2020年获得第一份开发工作的项目
  7. 计算机协议标准,网络协议标准规范大全
  8. GPRS模块为什么会低至十几元?我所经历的物联网模块国产化过程
  9. 如何通过病毒营销打造爆款产品
  10. PIE IN THE SKY