C++动态链接库中的全局变量面试题

本文探讨了C++动态链接库中全局变量在Linux和Windows平台上的构造行为差异,指出在Linux上多个动态链接库与主程序会共同初始化同一全局变量,导致构造函数被调用多次,而在Windows上则不会共享同一内存区域。测试还发现,无论动态加载(dlopen)时的flag设置或是否使用静态局部变量,问题仍然存在。这个问题在不同环境下可能引发意料之外的错误,提醒开发者注意动态链接库中全局变量的使用。
摘要由CSDN通过智能技术生成

其实主要问题是三个模块:

模块 a, 静态库 a
模块 b, 二进制 b, 静态引用a, 动态加载c
模块 c, 动态链接库c, 静态引用a

关键在于静态库a里有一个静态全局变量,没错就是我们的日志模块。原先的这个静态的模块中的静态全
局变量是有构造函数的,也就是构造函数干了点事情。我们都知道,程序载入在进入主函数前会依次初始
化全部的全局和静态变量。载入动态链接库时也不例外。这时候矛盾就来了,二进制b在进入主函数前会
初始化模块a中的全局变量,执行构造函数;然而载入动态链接库c时,也会启动对c内的全局变量进行初
始化,也会执行同一个对象的构造函数。这样,一个对象就会执行两次构造函数。在我们的程序里,就是
第二次执行构造函数的时候把全局变量的成员置空了。导致的结果是,我们的模块一开始有效,正常运行
了一会会之后,就失效了。当然在c里,并没有构造函数一说,对象构造时除了内存分配,什么都没干,
所以在纯c里并不会出现问题。这是碰到的问题,但是是不是在所有环境里都这样呢?或者使用静态成员
函数又如何?以下做了一个简单的测试:

一、模块a
.h文件:

struct foo_class {
    int m;
    foo_class();
    ~foo_class();
    static foo_class _;
};

.cpp文件:

#include <cstdio>
#include "a.h"
foo_class foo_class::_;
foo_class::foo_class() {
    m = 10;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

N1314N

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值