C++静态变量依赖关系

背景

常用单例之间操作相互依赖或者对同一份资源进行操作。进行对象或资源释放时候,很容易重复,导致程序异常。

依赖顺序

// a.cpp

static A a; // 第1个构造 → 最后释放

static LateDestructor late; // 依赖a,会后析构

// b.cpp

static B b; // 构造顺序依赖链接顺序 → 释放顺序不确定

// main.cpp

void foo() {

static C c; // 在foo()首次调用时构造 → 在main.cpp其他静态变量之后释放

}

int main() {

foo();

static D d; // 构造顺序较晚 → 释放顺序较早

return 0;

}

释放顺序:d → c → a → b(b的顺序不确定)

aexit
cpp 复制代码
#include <cstdlib>
#include <iostream>

void func1() { std::cout < "First\n"; }
void func2() { std::cout < "Second\n"; }
void func3() { std::cout < "Third\n"; }

int main() {
    atexit(func1);  // 第一个注册
    atexit(func2);  // 第二个注册
    atexit(func3);  // 第三个注册
    return 0;       // 执行顺序: func3 → func2 → func1
}
晚释放单例类
cpp 复制代码
//C++单例延后释放类 解决单例相互依赖问题,将当前单例留到最后释放。
class FTLibraryInstance
{
public:
    static std::string getVersion();
    static FT_Library &library();
    static void        release();
};

// 自定义删除器
struct FTLibraryDeleter
{
    void operator()(FT_Library *lib)
    {
        if (lib)
            FT_Done_FreeType(*lib);
    }
};

static std::unique_ptr<FT_Library, FTLibraryDeleter> kFTLibrary;

FT_Library &FTLibraryInstance::library()
{
    if (!kFTLibrary) {
        auto lib = new FT_Library;
        kFTLibrary.reset(lib);
        FT_New_Library(&gFTMemory, lib);
        FT_Add_Default_Modules(*lib);
        FT_Set_Default_Properties(*lib);
    }
    return *kFTLibrary;
}

std::string FTLibraryInstance::getVersion()
{
    auto lib = library();
    if (!lib)
        return "";
    FT_Int major, minor, patch;
    FT_Library_Version(lib, &major, &minor, &patch);
    std::string freetypeVersion = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(patch);
    return freetypeVersion;
}

void FTLibraryInstance::release()
{
    kFTLibrary.reset();
}

创作不易,小小的支持一下吧!

相关推荐
吴声子夜歌1 分钟前
Java面试——Flink原理及应用(二)
java·面试·flink
深念Y10 分钟前
数据库层设计的取舍:ORM 便利性与手写 SQL 的安全性权衡
java·数据库·sql·golang·框架·语言·ome
小江的记录本12 分钟前
【ORM 框架】MyBatis-Plus 核心特性、条件构造器、分页插件、乐观锁插件(附《思维导图》、《问题排查与实践清单》和《面试高频考点汇总》)
java·windows·spring boot·python·spring·面试·mybatis
clorinda13 分钟前
SQL 快速入门:题目单知识点精炼总结
java·数据库·sql
AI人工智能+电脑小能手23 分钟前
大白话说Java设计模式-40-备忘录模式(业务实战篇)
java·设计模式·事务回滚·备忘录模式·状态保存·spring transactional·购物车快照
SimonKing24 分钟前
白嫖国产多模态大模型:商汤 SenseNova 接入指南
java·后端·程序员
小江的记录本24 分钟前
【ORM框架】MyBatis核心原理、ORM思想、MyBatis vs JPA
java·数据库·后端·spring·spring cloud·oracle·mybatis
水饺编程32 分钟前
第5章,[Win32 章节] :绘制填充区域
c语言·c++·windows·visual studio
_明月35 分钟前
汇川技术股份有限公司面试--Java外包岗
java·面试·职场和发展
BD_Marathon36 分钟前
Hadoop常用端口号
java·大数据·hadoop