指定不同访问器中静态局部变量的构造/销毁顺序

2024-04-18

我遇到了崩溃cxa_finalize运行一个程序(这是一个程序,而不是其中的库):

$ ./ac-test.exe 
Assertion failed: AcLock.cpp(54): AcLock
libc++abi.dylib: terminate called without an active exception
Abort trap: 6

断言/崩溃是由于对象和记录器之间的交互造成的。记录器在对象之前被破坏,但对象使用记录器。因此,正在获取的弹出断言或崩溃的互斥体已经被销毁(因此原因pthread_mutex_lock锁定记录器时失败)。

我读过 GCC 手册指定变量的属性 http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html and 声明函数的属性 http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html,但我显然错过了一些东西。

我将对象和记录器放置在访问器内的公共标头中,并尝试指定构造顺序:

// AcGlobals.h
static AcLogger& GetLogger() {

    static AcLogger logger __attribute__(init_priority(50));
    return logger;
}
static AcSocketList& GetAcceptSockets() {

    static AcSocketList sockets __attribute__(init_priority(100));
    return sockets;
}

这导致了一堆错误:

./AcGlobals.h:24:46: error: expected ';' at end of declaration
    static AcLogger logger __attribute__((init_priori...

./AcGlobals.h:24:47: warning: declaration does not declare anything
      [-Wmissing-declarations]
    static AcLogger logger __attribute__((init_priori...

我还尝试将属性放在函数而不是变量上:

// AcGlobals.h
static AcLogger& GetLogger() __attribute__(init_priority(50)) {

    static AcLogger logger;
    return logger;
}
static AcSocketList& GetAcceptSockets() __attribute__(init_priority(100)) {

    static AcSocketList sockets;
    return sockets;
}

这导致了更多的问题:

./AcGlobals.h:22:53: warning: GCC does not allow init_priority attribute in this
      position on a function definition [-Wgcc-compat]
static AcLogger& GetLogger() __attribute__((init_priority(50))) {
                                              ^
./AcGlobals.h:22:53: error: can only use 'init_priority' attribute on file-scope
      definitions of objects of class type

我也尝试过__attribute__((constructor(50)))代替init_priority毫无喜悦。

Note:我正在苹果机器上工作。 Apple 有一个“功能”,其中构造函数优先级仅适用于同一文件中的修饰函数和变量。因此这些不能跨翻译单元分散。

准确地说,我如何指定本地静态对象的构造和销毁顺序?


这是使用 Meyers 单例时的一个经典问题 (这基本上就是你正在做的事情)。解决办法是not销毁单例;而不是静态本地 变量,您应该使用动态分配而不删除:

static  AcLogger& GetLogger()
{
    static AcLogger* logger = new AcLogger;
    return *logger;
}

请注意,在这种情况下,您必须确保每次使用 记录器刷新(但无论如何通常都是这种情况); 否则,您可能会得到未刷新的数据。

关于您尝试使用您的扩展功能 编译器:我不太熟悉它,但我不明白你如何 可以使用称为init_priority在局部变量上。 局部静态的构建(和破坏)时间 变量是由语言定义的(在这种情况下, 破坏时间是not你想要什么)。如果你想使用 这个非标准扩展,你可能必须做出 实例变量是静态类成员,甚至可能是全局变量 (在这种情况下,您不能将构造函数设为私有)。

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

指定不同访问器中静态局部变量的构造/销毁顺序 的相关文章

随机推荐

  • 如何从本地创建全局变量并存储其先前的值?

    在我的 pygame 游戏中 我希望子弹能够检测到它何时位于给定的命中框中 为此 我需要从本地创建一个全局变量 但是 每次出现新对象时 全局变量都会更新为新的碰撞盒 这不允许我跟踪之前的碰撞箱并检测子弹何时位于屏幕上的旧对象内 我该如何防止
  • 无法使用 JPA 获取与数据库的连接 - 缺少 derby 嵌入式驱动程序类

    我正在尝试使用 jpa 创建本地 derby 数据库 作为 JPA 实现 我使用 openjpa 并作为 sql 实现 derby 这是 persistence xml
  • Ruby 数组上未定义的方法“to_h”

    As per Ruby 数组文档 http ruby doc org core 2 2 0 Array html method i to h 有一个方法to h只要数组的每个元素是另一个包含两个元素的数组 就可以使用它将数组转换为哈希 以下
  • Android ListView,OnListItemClick,查找行id?

    我似乎无法找到如何获取我的 ListView OnListItemClick 以打开不同的活动 我知道我需要为 ListView 获取一些 row id 但我不知道如何做 现在 ListView 中的每一行都打开相同的活动 抱歉我的英语不好
  • JavaScript 的 for...in 循环如何处理多维数组?

    我在玩了一下 JavaScript 发现 至少对我来说 在通过 for in 循环处理多维数组时有奇怪的行为 所以我有这段代码
  • 在 C++ 中创建可修改的字符串文字

    是否可以在 C 中创建可修改的字符串文字 例如 char foo foo foo char afoo foo 0 afoo 2 g access violation 这会产生访问冲突 因为 foo 是在只读内存中分配的 我相信是 rdata
  • 什么时候应该使用各个线程同步对象?

    在什么情况下应该使用以下每个同步对象 读写锁 信号 Mutex 由于每次调用 post 时 wait 都会返回一次 因此信号量是一种基本的生产者 消费者模型 除了信号之外最简单的线程间消息形式 使用它们是为了让一个线程可以告诉另一个线程发生
  • 格式字符串参数不足

    我在Python中有这样的代码 def send start self player for p in self players player socket send cmd
  • 类型错误:“未定义”不是函数(评估“sinon.spy()”)

    我正在尝试使用sinon js http sinonjs org 在测试骨干应用程序时 但不幸的是 由于错误 我无法使用间谍方法 TypeError undefined is not a function evaluating sinon
  • 如何将 WPF 用户控件的宽度拉伸到其窗口?

    我有一个带有用户控件的窗口 我想让用户控件宽度等于窗口宽度 怎么做 用户控件是一个水平菜单 包含一个包含三列的网格
  • 系统windows窗体定时器参数

    如何将参数传递给System Windows Forms Timer private System Windows Forms Timer timer timer Interval 1000 timer Tick new EventHand
  • 如何将数据绑定到Spring表单中的列表

    我有一个带有支撑物体的弹簧形式 形式是这样的
  • 什么是 .htaccess 文件?

    我是 Zend 框架的初学者 我想了解更多关于 htaccess 文件及其用途 有人可以帮助我吗 我找到了一个这样的例子 htaccess 文件 AuthName Member s Area Name AuthUserFile path t
  • 转换为具体类并调用 Java 中的方法

    假设我们有一个名为A和一些子类 B C D ETC 大多数子类都有这个方法do 但基类没有 班级AA提供了一个方法叫做getObject 这将创建一个类型的对象B or C or D等 但将对象作为类型返回A 如何将返回的对象转换为具体类型
  • 如何使用salsa20计数器随机数?

    我不确定我是否做对了 消息计数器可以用作 代替随机数 我的意思是这样的消息 标头 2 字节 计数器 8字节 正文 n 字节加密 HMAC SHA1 计数器 1 63位 0 可以吗 我知道我不应该两次使用相同的密钥和相同的随机数 当新的连接启
  • 为什么Qt在qobject_cast、事件类型等方面重新实现RTTI?

    为什么 Qt 费心去重新实现相当于自定义 RTTI 系统和他们自己的系统 dynamic cast in the QObject层次结构 在QEvent etc 首先 Qt 中只有少数类层次结构实际上需要 RTTI 当您生成嵌入式代码时 您
  • 直接在Scipy稀疏矩阵上使用Intel mkl库以更少的内存计算A点A.T

    我想打电话mkl mkl scsrmultcsr https software intel com en us node 468640来自蟒蛇 目标是计算稀疏矩阵 C压缩稀疏行 http docs scipy org doc scipy 0
  • numpy.float64 不可迭代

    我正在尝试打印一个使用 numpy 数组和列表中的多个参数的函数 但我不断收到错误 numpy float 64 对象不可迭代 我在论坛上查看了关于这个主题的几个问题 并尝试了不同的答案 但似乎都不起作用 或者我可能做错了什么 我仍然是 p
  • Laravel查看路径错误

    当我更新视图文件时 我从旧路径获取视图文件 我有一个指向 IP vps 的域 我在其中安装了 laravel 让我们称之为 123 com 当我访问该域时 我会得到旧的视图路径 即我从中复制 Laravel 安装的文件夹的路径 该文件夹名为
  • 指定不同访问器中静态局部变量的构造/销毁顺序

    我遇到了崩溃cxa finalize运行一个程序 这是一个程序 而不是其中的库 ac test exe Assertion failed AcLock cpp 54 AcLock libc abi dylib terminate calle