C++学习笔记-DLL中动态内存管理
动态内存管理
在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中动态内存管理相关推荐
- C++ Primer Plus学习笔记之类和动态内存分配
前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...
- Objective-C基础教程学习笔记(九)内存管理
每个对象都维护一个保留计数器.对象被创建时,其保留计数器值1:对象被保留时,保留计数器值加1:对象被释放时,保留计数器值减1:当保留计数器值归0时,对象被销毁.在销毁对象时,首先调用对象的deallo ...
- WSF操作系统抽象层学习笔记 (一) ---简介和内存管理
一.简介 WSF(wireless software foundation)是对操作系统的一个简单的封装,提供对操作系统的简单编程,提供简单的系统服务 功能简介: 事件.消息传递和处理. 定时器功能. ...
- Linux操作系统学习笔记(十)内存管理之内存映射
一. 前言 本文为内存部分最后一篇,介绍内存映射.内存映射不仅是物理内存和虚拟内存间的映射,也包括将文件中的内容映射到虚拟内存空间.这个时候,访问内存空间就能够访问到文件里面的数据.而仅有物理内存 ...
- JVM学习笔记(三)------内存管理和垃圾回收
JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制.堆被划分为新生代和旧生 ...
- JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...
- C语言-动态内存管理(malloc()、calloc()、realloc()、free())
C语言 动态内存分配 文章目录 C语言 动态内存分配 前言 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.初识malloc()和free() 2.malloc()和free()的简单使用 ...
- 【带你吃透C++】C++动态内存管理
C++动态内存管理 前言 1. C/C++内存分布 例题理解 2.C语言中动态内存管理方式( malloc/calloc/realloc和free) 3.C++中动态内存管理方式 new和delete ...
- C++---动态内存管理
C/C++内存分布 栈:存储非静态局部变量.函数参数.返回值. 内存映射段:动态库. 堆:程序运行时动态内存分配. 数据段:存储全局变量.静态数据. 代码段:可执行代码,只读常量. C语言中动态内存管 ...
最新文章
- PL/SQL第五章 Order by排序
- golang中的strings.TrimSpace
- kuka机器人股票代码_【内幕】溢价收购KUKA机器人 美的钱从哪来?
- 诺基亚入门级音乐手机售319元
- 比特大陆招股书讲了个AI的故事,但资本市场愿意听吗?
- hane WIN nfs配置
- 简单的网页制作期末作业
- C语言也能干大事第十二节(如鹏基础)
- 天线设计-电感计算以及天线匹配
- 微信h5页面中下载app(apk)的解决方案
- Atitit q2016 q0 doc list on home ntpc.docx
- 树莓派小车————远程控制
- appinventor网络编程php,AppInventor离线版下载
- 江南爱窗帘十大品牌,怎么合理的搭配窗帘配色
- c语言用fopen打开txt,C语言fopen不能打开.txt文件
- python怎么安装whl文件
- 计算机网络-MAC地址与以太网帧格式
- trs java_trs常见问题 - This Is A FineDay - BlogJava
- C语言基于FOC控制算法和STM32主控芯片的双路直流无刷电机控制器源码
- PF_RING 6.0.2在Redhat 6.3 x86_64上编译和安装