动态内存管理
在dll中malloc的内存,必须在dll中free
注:这是由Windows自己的特点决定!

如果 a 编译成静态库,有下面两种解决方法:
1.b.dll 和 c.dll 使用同一个款编译器编译(保证CRT库版本一致),编译选项都选择 /MD(/MDD),这样不需 要担心内存是谁释放的问题了,因为他们底层使用的是同一个Heap,可以随便使用!
2.不要在 b.dll 中分配内存,然后在 c.dll 中释放,因为他们底层使用的是不同的 Heap,可以在 b 中包装一下 a 提供的释放函数,再由c调用,这样 a 的分配和释放都是由 b.dll 控制的,在同一个堆内,就没事了!

如果 a 编译成动态库,那么
由于 a 内部得内存分配和释放都使用的是 a.dll 的堆,就不会堆不合法错误了。

遵循一些原则:
1. 尽量避免是直接使用其他DLL里面的全局对象。 因为DLL释放的时候,在其中的全局对象也会被释放, 有可能引起访问违例
2. DLL中导出了分配资源的函数, 则同时要导出对应的释放函数,否则很容易写出在分配是用new,释放使用free的情况。

如下面的dll代码:

#include <stdio.h>
#include <stdlib.h>__declspec(dllexport) int* MyAlloc(int size){int *p = (int*)malloc(size * sizeof(int));for(int i = 0; i < size; i++){p[i] = i;}return p;
}__declspec(dllexport) void MyFree(int *p){free(p);
}

调用源码:

#include <stdio.h>
#include <stdlib.h>#pragma comment(lib, "MyDll.lib")
#define MYDLL __declspec(dllexport)MYDLL int* MyAlloc(int size);
MYDLL void MyFree(int *p);int main(){int *p = MyAlloc(10);for(int i = 0; i < 10; i++){printf("%d\n", p[i]);}free(p);getchar();return 0;
}

运行截图如下:

解决这个问题,有2个方式,一个是一个款编译器编译(保证CRT库版本一致),编译选项都选择 /MD(/MDD)

如下图:

或者如下代码

#include <stdio.h>
#include <stdlib.h>#pragma comment(lib, "MyDll.lib")
#define MYDLL __declspec(dllexport)MYDLL int* MyAlloc(int size);
MYDLL void MyFree(int *p);int main(){int *p = MyAlloc(10);for(int i = 0; i < 10; i++){printf("%d\n", p[i]);}MyFree(p);getchar();return 0;
}

C++学习笔记-DLL中动态内存管理相关推荐

  1. C++ Primer Plus学习笔记之类和动态内存分配

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  2. Objective-C基础教程学习笔记(九)内存管理

    每个对象都维护一个保留计数器.对象被创建时,其保留计数器值1:对象被保留时,保留计数器值加1:对象被释放时,保留计数器值减1:当保留计数器值归0时,对象被销毁.在销毁对象时,首先调用对象的deallo ...

  3. WSF操作系统抽象层学习笔记 (一) ---简介和内存管理

    一.简介 WSF(wireless software foundation)是对操作系统的一个简单的封装,提供对操作系统的简单编程,提供简单的系统服务 功能简介: 事件.消息传递和处理. 定时器功能. ...

  4. Linux操作系统学习笔记(十)内存管理之内存映射

    一. 前言   本文为内存部分最后一篇,介绍内存映射.内存映射不仅是物理内存和虚拟内存间的映射,也包括将文件中的内容映射到虚拟内存空间.这个时候,访问内存空间就能够访问到文件里面的数据.而仅有物理内存 ...

  5. JVM学习笔记(三)------内存管理和垃圾回收

    JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制.堆被划分为新生代和旧生 ...

  6. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  7. C语言-动态内存管理(malloc()、calloc()、realloc()、free())

    C语言 动态内存分配 文章目录 C语言 动态内存分配 前言 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.初识malloc()和free() 2.malloc()和free()的简单使用 ...

  8. 【带你吃透C++】C++动态内存管理

    C++动态内存管理 前言 1. C/C++内存分布 例题理解 2.C语言中动态内存管理方式( malloc/calloc/realloc和free) 3.C++中动态内存管理方式 new和delete ...

  9. C++---动态内存管理

    C/C++内存分布 栈:存储非静态局部变量.函数参数.返回值. 内存映射段:动态库. 堆:程序运行时动态内存分配. 数据段:存储全局变量.静态数据. 代码段:可执行代码,只读常量. C语言中动态内存管 ...

最新文章

  1. PL/SQL第五章 Order by排序
  2. golang中的strings.TrimSpace
  3. kuka机器人股票代码_【内幕】溢价收购KUKA机器人 美的钱从哪来?
  4. 诺基亚入门级音乐手机售319元
  5. 比特大陆招股书讲了个AI的故事,但资本市场愿意听吗?
  6. hane WIN nfs配置
  7. 简单的网页制作期末作业
  8. C语言也能干大事第十二节(如鹏基础)
  9. 天线设计-电感计算以及天线匹配
  10. 微信h5页面中下载app(apk)的解决方案
  11. Atitit q2016 q0 doc list on home ntpc.docx
  12. 树莓派小车————远程控制
  13. appinventor网络编程php,AppInventor离线版下载
  14. 江南爱窗帘十大品牌,怎么合理的搭配窗帘配色
  15. c语言用fopen打开txt,C语言fopen不能打开.txt文件
  16. python怎么安装whl文件
  17. 计算机网络-MAC地址与以太网帧格式
  18. trs java_trs常见问题 - This Is A FineDay - BlogJava
  19. C语言基于FOC控制算法和STM32主控芯片的双路直流无刷电机控制器源码
  20. PF_RING 6.0.2在Redhat 6.3 x86_64上编译和安装

热门文章

  1. 中文网页重设与排版:TYPO.CSS
  2. 女大学生毕业相亲程序员,吃了一顿大排档,一看车钥匙后犹豫了!
  3. 面对小点点谷歌广告表示很无奈
  4. C++数组动态分配空间国外玩家最关注的韩游
  5. SQL2008学习小结
  6. 如今编程成为了一个越来越重要的「技能」,如何自学编程我来教你
  7. Python 为了提升性能,竟运用了共享经济!赶紧看看!!
  8. 想加入IT行业为何建议你学Python,不要错过时机哦
  9. 这几张图告诉你程序员的变化,最后一张图扎心了
  10. 机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)