不要在动态链接库接口中,使用C++标准库中的容器

news/2024/11/15 1:06:14 标签: c++, 开发语言

1. 起因

最近程序老是崩溃在调用动态库接口的代码附近,经过半天的代码审查,也没有看出来什么门道。

最后求助网络,发现原来C++标准库容器不能用来作为接口的一部分使用。这和模板的跨库问题是同一个问题。

2. 问题分析

相关技术分析,参考以下文章:
【C/C++笔记】之在动态链接库中传递STL容器的引用或指针

3. 解决方案

  • 方案一:使用纯C接口,代替C++接口,自然就不存在容器的问题。
  • 方案二:使用Qt容器,即QTL,代替C++标准库中的容器。参考: Qt中的容器QVector, QList等,是否可以跨dll使用?

另外,在Windows上,还存在一个内存谁申请的必须由谁释放的要求,或者使用多线程调试/MD选项。参考:
关于在dll中申请内存,外部释放的问题
本质上还是变量跨库与链接的问题。

4. 最后

关于动态库内存管理,以及常见的坑,基本上只有以上两点,使用的时候采用安全保守的写法即可。


http://www.niftyadmin.cn/n/5752524.html

相关文章

Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)

前言 本文一开始是属于此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分,考虑后Diffusion Policy的重要性很高,加之后续还有一系列基于其的改进工作 故独立成本文,且写的过程中 …

C/C++语言基础--C++模板与元编程系列六,C++元编程相关库的讲解与使用

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 模板与元编程是C的重要特点,也是难点,本人预计将会更新10期左右进行讲解,这是第六期,讲解元编程相关库等,本人感觉这一部分内容还是比较复杂的&am…

python的包引入

Python模块导入的基本原理: 当您在Python中导入模块时,Python会按照以下顺序搜索模块路径: 当前脚本所在的目录(或称工作目录)环境变量 PYTHONPATH 指定的目录标准库和第三方库的安装目录 创建如下结构 my_proje…

Spring Validation参数校验

Validation Validation是Spring提供的一个参数校验框架&#xff0c;使用预定义的注解完成参数校验 使用步骤 引入Spring Validation起步依赖在参数前面加上Pattern注解在需要校验的参数所在的类上添加Validated注解 <!--参数校验依赖--><dependency><groupId&…

【CentOS】中的Firewalld:全面介绍与实战应用(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、iptables 时代 2、firewalld 时代 3、 从 ipt…

c++初级--->namespace关键字,输入输出,缺省参数,函数重载

1.namespace关键字&#xff1a; namespace关键字是用于生成一个命名空间&#xff0c;这个空间中可以定义变量&#xff0c;函数&#xff0c;通过这个关键字&#xff0c;可以解决函数在文件展开的时候会因为引用头文件中有相同的变量名而导致的报错&#xff1b; 举例验证&#…

逐行加载 HTML 内容并实时显示效果:使用 wxPython 的实现

这篇博客中&#xff0c;我们将详细分析如何使用 wxPython 构建一个简单的桌面应用程序&#xff0c;用于逐行加载并显示 HTML 文件的内容&#xff0c;并在加载完成后通过浏览器组件呈现最终页面。通过该应用&#xff0c;我们可以体验到逐行加载 HTML 内容的视觉效果&#xff0c;…

Golang | Leetcode Golang题解之第563题二叉树的坡度

题目&#xff1a; 题解&#xff1a; func findTilt(root *TreeNode) (ans int) {var dfs func(*TreeNode) intdfs func(node *TreeNode) int {if node nil {return 0}sumLeft : dfs(node.Left)sumRight : dfs(node.Right)ans abs(sumLeft - sumRight)return sumLeft sumRi…