现在有dll模块A,dll模块B以及静态库C,

C中有个全局Create()函数负责创建对象M,当第二次调用Create()的时候会增加引用计数,并返回原来创建的对象M。Relase()会减少引用计数。当引用计数为0时,销毁对象M。现在在模块A中创建的初始化对象M,模块B继续调用Create(),出现在模块B中得到的对象并不是模块A所创建的对象M。想简单的通过将模块A中创建的对象M传给模块B解决问题,但在卸载A,B模块的时候会出现释放空指针的问题

具体跟踪:

当在模块A中使用静态库Create()创建对象M,在模块A中其他地方也这样使用Create(),引用计数如预料中增加,即调用两次,引用计数增加至2,并返回已经创建好的M。

但接下来,在模块B中使用静态库Create()创建对象M,会出现引用计数重新开始计数,也就是说新创建了另外个对象。

原因就是因为跨模块,此时的全局函数只能相对于模块全局。

进一步讲就是,当在模块A中引用计数这个变量,对象M的指针,以及指针所指向的内存都是在A中的heap中分配的,

而在模块B中,它们的内存却在B中的heap中分配的,当然会出现创建新对象的现象。

解决方法:需要将对象M的创建先于模块A,和模块B,然后在初始化模块A,模块B的时候将创建好的对象M传给它们使用,然后在模块A和模块B卸载后,释放对象M。注意这里Create()函数的引用计数已经不起作用了。

跨模块中的分配内存问题相关推荐

  1. ngx_lua模块中的共享内存字典项API

    在ngx_lua模块中使用共享内存字典项相关API的前提条件是已经使用lua_shared_dict命令定义了一个字典项对象,该命令的具体用法为: 语法:lua_shared_dict <nam ...

  2. Linux内核中kzalloc分配内存时用的参数GFP_KERNEL详解

    简介 GFP(Get Free Pages缩写)在include/linux/gfp.h中定义. GFP_KERNEL 是内核内存分配时最常用的,无内存可用时可引起休眠. GFP_ATOMIC 用来从 ...

  3. 【Unity3D】中如何分配内存占用(解决内存占用过大问题)

    最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个 ...

  4. 浅谈C++跨模块释放内存

    浅谈C++跨模块释放内存 一, MT改MD 二, DLL提供释放接口 三, 使用进程堆申请内存 在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存.这一点,我们在很多开源库或者平常项目中也 ...

  5. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  6. 在Linux内核模块中使用CMA内存分配

    在Linux内核模块中使用CMA内存分配 前言 1. 什么是CMA? 2. CMA使用前的准备 2.1 内核配置选项 2.2 内核启动参数 2.3 CMA操作接口 3. 在内核模块中使用 3.1 模块 ...

  7. 操作系统内存管理模块中的动态重定位需要由什么来实现?

    操作系统可以使用一种称为重定位的技术来管理每个进程在内存中的存储位置. 操作系统核心模块通常存储在最高的内存地址中. 当程序编译并执行时,它从零地址位开始处理,最大地址等于总内存大小减去操作系统大小. ...

  8. C++中的动态内存分配

    1.Cpp中的内存分配 了解动态内存在C++中是如何工作的是成为一名合格的C++程序员必不可少的.C++程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的 ...

  9. C++中给二维指针分配内存

          我们都知道在 C++ 中分配动态数组用的是 new , 撤销动态数组用的是 delete[ ] ,现在让我们来看看怎么利用这两个关键字给二维指针分配内存.       原理就不写在这里了, ...

最新文章

  1. Ubuntu18.04 误删/usr/bin/python3的解决方案
  2. 以太坊RLP机制分析
  3. 线性回归之数学:求导公式
  4. [单刷APUE系列]第八章——进程控制[1]
  5. 机器人学习--机器人仿真环境汇总
  6. Yii的控制器等名称获取
  7. 在windows下用VMware虚拟机来安装linux
  8. Linux安装宝塔面板
  9. 1.1 Machine learning: what and why?
  10. python online json editor_JSON Editor 中文文档
  11. Java 使用Commons-fileupload组件实现上传
  12. 如何精简企业主数据“裹脚布”
  13. 「leetcode」78. 子集【回溯算法】详解!
  14. ibus五笔快捷键 繁简 单字 词组切换
  15. pantum打印机驱动安装m6506_奔图Pantum M6506NW 驱动
  16. OSPF笔记[DR与BDR]
  17. SendCloud从注册到邮件发送使用心得
  18. web爬虫之登录google paly 商店
  19. Python三元表达式(三目运算符)|Python技能树征题
  20. 【优化】py2下hbase的字符串编码问题(\\xe7\\xbc\\x96)

热门文章

  1. Python实现二叉树的遍历
  2. Spring体系常用方法(一)
  3. python opencv3 检测人
  4. LinkedList源码详解
  5. CSS计数器(自定义列表)
  6. Windows中使用wget整站下载
  7. python基础学习1-内置函数
  8. 基于哈夫曼编码完成的文件压缩及解压
  9. PHP中一些有用的函数
  10. 在godaddy的空间上发布使用MySql 和 Entity Framework做的网站时遇到的Security Exception...