C++全局变量被多次析构导致程序崩溃的问题

2023-11-04

问题描述

1 在静态库libxxx.a中定义了一个全局的string对象

2 有多个so文件都连接了这个静态库, 并且引用了这个全局变量

3 有一个程序同时加载了多个上述的so文件

4 在这个程序退出时, 全局的string就会被多次析构

5 stl的string对象析构多次就会导致程序crash

解决方案

使用智能指针, 而不是直接使用string对象, 这样即使析构多次也没有问题

下面是我实现的一个简单的智能指针, 供参考


template <class T> class MySmartPtr
{
public:
	explicit MySmartPtr(T *p) : m_p(p) {}
	~MySmartPtr()
	{
		if(m_p){
			delete m_p; 
        	// 防止被析构多次
			m_p = NULL;
		}
	}

	// 解引用
	T& operator*() { return *m_p; }
	
	// 用于访问T的成员变量
	T* operator->() { return m_p; }

	// 用于访问T的成员变量
	T& get() { return *m_p; }

protected:
	MySmartPtr(const MySmartPtr<T>& rhs);
	void operator=(const MySmartPtr<T>& rhs);

	T *m_p;
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++全局变量被多次析构导致程序崩溃的问题 的相关文章

随机推荐

  • ArcFace/InsightFace使用自己数据训练/验证过程(3)

    分类专栏 人脸识别 InsightFace训练过程 文章标签 insightface自定义数据训练 arcface训练 人脸识别训练过程 版权 人脸识别 同时被 2 个专栏收录 4 篇文章1 订阅 订阅专栏 InsightFace训练过程
  • DWORD类型

    DWORD 类型基本相关 DWORD 宏定义 typedef unsigned long DWORD 1 要使用DWORD要添加头文件
  • 【好题】第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 G-Num 思维+推公式

    题 推公式 a b a b a b 1 b a b 1 b 1 1 a 1 b 1 1 因此 令n 若n为质数 说明没有一个 a 1 b 1 可以组成它 就输出No 代码 include
  • Unity入门教程

    一 介绍 目的 通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏 熟悉使用Unity进行游戏开发的基本流程 软件环境 Unity 2017 3 0f3 Visual Studio 2013 二 创建新项目 1 启动Unity后将出现一个并
  • Source Insight 4下载及中文乱码解决

    Source Insight 4 00 0121含补丁和许可证激活码 source insight 4下载链接 https www sdbeta com wg 2019 0621 230136 html 梳理 先配置整个工程为GB2312
  • 知乎越来越无聊了,真是想破了脑袋找可以装逼的地方!

    什么有一个优秀的女友是什么感觉 有个青梅竹马的女友又是什么感觉 你不如说和优秀的女友操B做爱是什么感觉 反正操多了就是那么回事 对不对 最烦这些装逼的家伙
  • Springboot 性能优化(亲测)——SpringBoot学习

    SpringBoot 是一个快速开发框架 能够快速的整合第三方框架 简化XML配置 全部采用注解形式 内置Tomcat容器 帮助开发者能够实现快速开发 SpringBoot的Web组件 默认集成的是SpringMVC框架 尽管 Spring
  • 完整实现 - 通过 DelayQueue 实现延时任务

    一 DelayQueue 的应用原理 二 订单延时任务的实现 三 订单处理 四 优缺点 实现延时任务有很多的方法 网上关于延时任务的实现的文章已经不少了 比如 实现延时任务的 10 种方法等等 但是这些文章基本上都是将方法大概的列举一下 给
  • 树(实现树的从上到下,从左到右遍历)

    具体描述 从上往下打印出二叉树的每个节点 同层节点从左至右打印 整体思想 借助一个队列进行实现 include
  • 开发微服务电商项目演示(五)

    登录方式调整 第1步 从zmall common的pom xml中移除spring session data redis依赖 注意 本章节中不采用spring session方式 改用redis直接存储用户登录信息 主要是为了方便之后的jm
  • 论文阅读笔记:Masked Autoencoders Are Scalable Vision Learners

    论文阅读笔记 Masked Autoencoders Are Scalable Vision Learners 摘要 介绍 实现 MASKING MAE编码器 MAE解码器 简单的实现 在 ImageNet 上的简单测试 Baseline
  • vue el-tabs中的分页 每个互不影响

    tabs展示 重点看分页
  • 冒泡排序+怎么计算时间复杂度

    冒泡排序的基本思想 时间复杂度为O N 2 每次比较两个相邻元素 如果他们的顺序错误就把它们交换过来 举个栗子 例如我们需要将 12 35 99 18 76 5个数进行从大到小排序 既然是从大到小排序 也就是越小越靠后 首先比较第一个数和第
  • vue组件props传值,对象获取不到的问题

    先说问题 父组件利用props向子组件传值 浏览器console有这个值 但是获取不到内部的属性 困了我3个小时 真的 父组件定义了personal这个值 在父组件接口中给这个值重新赋值 子组件接受这个值 浏览器console能看到这个值
  • 韩国100m无限流量服务器,CloudCone:$59/月独立服务器/X3363/8GB/2TB/100M无限流量/洛杉矶机房...

    Intel Xeon X3363 4 Cores 2 83 GHz 8GB RAM 2 TB HDD or 240 GB SSD 100 Mbps Unmetered 29 IPv4 5 IPs 64 IPv6 69 MO Limited
  • Spring Boot 如何处理国际化

    Spring Boot 国际化 在全球化的今天 很多应用程序需要支持多种语言和地区 为了满足不同用户的需求 应用程序需要提供多语言的支持 Spring Boot 提供了强大的国际化支持 使得开发人员能够轻松地为应用程序添加多语言支持 本文将
  • Flutter的Stack和Positioned的控件

    简介 Flutter中的Stack控件是一种可用于将多个子控件重叠在一起的布局控件 Stack将所有子控件放在同一个位置 它们可以根据需要进行定位 缩放或旋转 Stack中的子控件可以是任何类型的控件 例如文本 图像 按钮等 主要属性 St
  • ImageRewrad

    ImageReward Learning and Evaluating Human Preferences for Text to Image Generation https arxiv org pdf 2304 05977 pdf ht
  • 雪花算法实现

    文章目录 原理 引入依赖 SnowflakeManager 生成ID SnowflakeProperties 配置 注册SnowflakeManager snowflake的yaml 测试 原理 分别有三部分 其中第一位保留位 暂时没用 第
  • C++全局变量被多次析构导致程序崩溃的问题

    问题描述 1 在静态库libxxx a中定义了一个全局的string对象 2 有多个so文件都连接了这个静态库 并且引用了这个全局变量 3 有一个程序同时加载了多个上述的so文件 4 在这个程序退出时 全局的string就会被多次析构 5