C++单例模式跨DLL调用问题梳理

问题案例:

假设有这样一个单例模式的代码

//test.h header
class Test
{
public:static Test &instance() {static Test ins;return ins;}void foo();
};void testFoo();
//test.cpp source
#include "test.h"void Test::foo()
{printf("%p\n", this);
}
void Bar()
{Test::instance().foo();
}

接下来分别调用它们

#include "test.h"int main()
{Bar();Test::instance().foo();return 0;
}

运行后得到结果

>./main
>00007ff8c63a8110
>00007ff664923100

居然得到了不一样的地址,说明这种方法实现单例会发生意料之外的问题。
通过网上检索后终于知道:由于static变量是单个编译单元的变量,当dll代码中的头文件定义static变量时并且main函数调用时,ins变量实际已经被认为是两个静态变量了(个人猜想:编译器为了区分变量,可能会隐式添加后缀用于区分),因此在main中调用Test::instance().foo()时,实际是在第一次构造属于主程序单元内的ins静态变量。

解决办法

1.将instance实现方法写到cpp中

将static变量的定义写到cpp中,则不会在dll中编译时标记ins为静态变量,确保了其唯一性。

//test.cpp source
#include "test.h"Test &Test::instance()
{static Test ins;return ins;
}

2.手写一个管理类

在某乎看到大佬写的,其原理是将所有获取单例的方法集合在一起,但需要注意它不满足支持热卸载的动态库,因为是管理的指针
https://github.com/KondeU/GlobalSingleton/tree/master

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32-S3系统级芯片支持烧录的编程语言

ESP32-S3作为一款功能强大的MCU系统级芯片,支持多种编程语言的烧录和开发。以下是对ESP32-S3支持的主要编程语言的详细介绍: 一、C/C ESP-IDF框架:ESP32-S3支持使用乐鑫官方的ESP-IDF(Espressif IoT Development Framework&…

Redis 数据库源码分析

Redis 数据库源码分析 我们都知道Redis是一个 <key,value> 的键值数据库&#xff0c;其实也就是一个 Map。如果让我来实现这样一个 Map&#xff0c;我肯定是用数组&#xff0c;当一个 key 来的时候&#xff0c;首先进行 hash 运算&#xff0c;接着对数据的 length 取余&…

我的nvim的init.lua配置

nvim的配置文件路径在&#xff5e;/.config/nvim路径下&#xff1a; 一、目录如下&#xff1a; coc-settings.json文件是配置代码片段路径的文件init.lua配置文件的启动脚本lua/config.lua 全局配置文件lua/keymaps.lua 快捷键映射键文件lua/plugins.lua 插件的安装和配置文件…

权限掩码umask

1 、 设置新建文件或目录的默认权限 在 Linux 系统中&#xff0c;当用户创建一个新的文件或目录时&#xff0c;系统都会为新建的文件或目录分配默认的权限&#xff0c;该默认权限与umask 值有关&#xff0c;其具体关系是&#xff1a; 新建文件的默认权限 0666-umask 值 新建…

Kubernetes Gateway API-5-后端协议和网关基础设置标签

1 后端协议 自 v1.2.0 开始支持 并非所有网关API实现都支持自动协议选择。在某些情况下&#xff0c;协议在没有明确选择加入的情况下被禁用。 当 Route 的后端引用Kubernetes Service 时&#xff0c;应用程序开发人员可以使用 ServicePort appProtocol 字段指定协议。 例如…

C++语言的网络编程

C语言的网络编程 引言 随着互联网的迅猛发展&#xff0c;网络编程已成为软件开发的重要组成部分。C作为一种高效的编程语言&#xff0c;因其出色的性能和灵活性&#xff0c;广泛应用于网络编程领域。本文将介绍C网络编程的基本概念、常用的网络库&#xff0c;以及一些具体的应…

考试座位号(PTA)C语言

每个 PAT 考生在参加考试时都会被分配两个座位号&#xff0c;一个是试机座位&#xff0c;一个是考试座位。正常情况下&#xff0c;考生在入场时先得到试机座位号码&#xff0c;入座进入试机状态后&#xff0c;系统会显示该考生的考试座位号码&#xff0c;考试时考生需要换到考试…

宝安湾区之光附近的钓鱼点

工作日的午休我经常在公司附近骑行&#xff0c;有时候也会骑行到宝安的湾区之光。但是我最感兴趣的除了湾区之光摩天轮&#xff0c;还有雷打不动的快乐钓鱼佬。 上图红框区域的河岸每天都会出现零零散散的快乐钓鱼佬&#xff0c;他们好像都有自己的钓鱼窝点。我发现来这里钓鱼也…

GNU链接器简介-3

GNU链接器简介-3 1 SECTIONS Command1.1 Output Section Description2.2 Output Section Name1.3 Output Section Address1.4 Input Section Description1.4.1 Input Section Basics1.4.2 Input Section Wildcard Patterns1.4.3 Input Section for Common Symbols1.4.4 Input S…

【练习】PAT 乙 1022 D进制的A+B

题目 输入两个非负10进制整数A和B(<2^30-1)&#xff0c;输出AB的D (1 < D < 10)进制数。 输入格式 输入在一行中依次给出3个整数A、B和D。 输出格式 输出AB的D进制数。 输入样例 123 456 8 输出样例 1103 来源&#xff1a;PAT 乙 1022 D进制的AB ——————————…

音视频-----RTSP协议 音视频编解码

流媒体协议详解&#xff1a;RTSP、RTP、RTCP、SIP、SDP、RTMP、WebRTC、WebSocket-CSDN博客 上文讲解比较清楚 多媒体编解码基础知识 一文详解WebRTC、RTSP、RTMP、SRT-腾讯云开发者社区-腾讯云 流媒体协议简介 &#xff08;整理&总结&#xff09;-CSDN博客 RTP :(Real-…

实时数仓与离线数仓的全面对比

在大数据和数据仓库的领域&#xff0c;实时数仓和离线数仓是两种常见的架构。它们分别适用于不同的业务场景&#xff0c;具有不同的技术特点、实现方式和使用场景。 下面将从底层原理、架构、技术实现、数据处理方式等多个方面对这两者进行详细对比。 1. 基本定义 实时数仓&…

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师&#xff0c;提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师&#xff1a;希望获得更多的学生资源&#xff0c;通过平台展示自己的教学特长和经验&#xff0c;管理个人日程&#xff0c;接收并确认预约请求&a…

头歌python实验:网络安全应用实践-恶意流量检测

第1关:re 库的使用 本关任务:编写一个能正则匹配出 ip 地址的小程序。 re 的主要功能函数 常用的功能函数包括: compile、search、match、split、findall(finditer)、sub(subn)。 re.search 函数 re.search 扫描整个字符串并返回第一个成功的匹配。 函数语法: re…

第1章:Go语言入门

第1章&#xff1a;Go语言入门 1. Go语言概述 1.1 语言历史 Go语言&#xff08;Golang&#xff09;是由Google公司于2007年开始开发&#xff0c;并于2009年正式开源的编程语言。其主要创始人包括&#xff1a; Rob Pike&#xff08;Unix和Plan 9操作系统的创始人之一&#xf…

Linux 系统安装 NCBI Blast + A Quick Guide

前言 NCBI BLAST&#xff08;Basic Local Alignment Search Tool&#xff09;是由美国国家生物技术信息中心&#xff08;NCBI&#xff09;开发的一个深受生物信息学研究者青睐的基因序列比对工具。作为生物序列信息比对的行业标准&#xff0c;BLAST可用于分析核酸&#xff08;…

嵌入式科普(26)为什么heap通常8字节对齐

目录 一、概述 二、newlibc heap 2.1 stm32cubeide .ld heap 2.2 e2studio .ld heap 三、glibc源码 3.1 Ubuntu c heap 四、总结 一、概述 结论&#xff1a;在嵌入式c语言中&#xff0c;heap通常8字节对齐 本文主要分析这个问题的分析过程 二、newlibc heap newlibc…

JVM调优,参数在哪里设置的?

JVM调优&#xff0c;参数在哪里设置的&#xff1f; 在Java应用程序中&#xff0c;JVM&#xff08;Java Virtual Machine&#xff09;的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。 1. JVM参数的位置 JVM参…

nginx学习之路-nginx配置https服务器

文章目录 1. 生成证书2. 配置证书1. 拷贝证书文件2. 修改conf/nginx.conf文件内容 3. 查看效果1. 重载配置2. 访问 1. 生成证书 在linux系统下执行&#xff0c;使用openssl命令。&#xff08;windows环境也可以使用cmder&#xff09; # 1. 生成私钥 server2025.key(无密码保护…

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…