c++跨动态库DLL的内存分配与释放问题2

摘要:
本文讨论了DLL之间的动态内存分配和释放。动态库DLL中C++的内存分配和释放问题。当我今天查看VTK的源代码时,我突然想到了一个内存分配原则,这可以在C++动态库的设计中参考。总之,指向动态分配内存的所有指针都封装在类中,并通过接口向用户公开。这样,可以避免在A.dll中进行分配,而在dll中的B Release中进行分配。乍一看,这似乎是无稽之谈,但实际上,它仍然具有参考意义。也就是说,A将原始内存暴露给B,而不是重新分配内存副本。
在这一篇文章中讨论了跨DLL的动态内存分配与释放问题。
c++跨动态库DLL的内存分配与释放问题
今天在看VTK的源代码时,突然得出了一个关于内存分配的原则,在C++的动态库设计时可以参考。总结成一句话就是:把所有动态分配的内存的指针都封装到类里面,对用户通过接口暴露。这样就可以避免在A.dll中分配,在B.dll中释放的情况。乍一看是废话,其实还是有参考意义的。举例进行说明。
例如在A.dll中有一个Country类,里面保存有所有城市的名字,保存在std::vector中。我们在B.dll中想获取这些名字,就应该把Country的结构设计成const std::vector &Names()const的形式,而不是std::vector Names()const或者void Names(std::vector&)const的形式。也就是说A把原始的内存暴露给B,而不是重新分配一份内存。
 

免责声明:文章转载自《c++跨动态库DLL的内存分配与释放问题2》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇小程序内嵌H5——判断小程序环境的坑WPF中为窗体设置背景图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

动态库链接注意事项

    编译链接动态库时需要注意几个点:     1)链接阶段要指定动态库的路径,与运行时要查找的动态库的路径是两个概念。     2)链接阶段,如果是通过-l选项指定动态库时,需要搭配-L选项指定链接路径。这要求动态库使用lib前缀。       如果依赖的动态库没有lib前缀,可以考虑指定动态库的路径,以依赖文件的方式链接。       比如编译动态库...

预处理命令

C++提供的预处理功能主要有以下3种 1、宏定义 2、文件包含 3、条件编译 为了与一般C++语句相区别,这些命令以符号#开头,而且末尾不包含分号 宏定义 用#define命令将一个指定的标识符(即宏名)来代表一个字符串。定义宏的作用一般是用一个短的名字代笔一个长的字符串。它的一般形式 #define标识符字符串 在C语言中用#define定义符号常量,...

理工科应该的知道的C/C++数学计算库(转)

理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析、数值计算、三维建模、信号处理、性能分析、仿真分析。。。这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件系统的某一个很有限的功能,你是不是也要因此再用一用那动辄几个g的软件呢?其实我觉得如果系统不是很大,不是很复杂,我们个人完全有可能自己去编写代码来实现这些‘’...

C++静态库与动态库(比较透彻)

这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。 什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存...

实现对第三方应用任意SO注入

实现对第三方应用任意SO注入 0x01 应用在Android中运行,从外部对该进程可以进行任意SO文件动态注入,就是应用动态运行我们的SO文件 0x02 基本的逻辑是: 1.    获取目标进程的pid,关联目标进程:通过遍历查找/proc/pid/cmdline文件中是否含有目标进程名process_name,若有则进程名对应的进程号即为pid。接着,直...

MySQL-8.0.21安装

1.安装依赖 yum install -y ncurses-devel libaio-devel glibc autoconf openssl openssl-devel 2.安装cmake cd wget https://github.com/Kitware/CMake/releases/download/v3.19.0-rc3/cmake-3.19....