gpt4 book ai didi

linux - 静态变量没有被初始化

转载 作者:太空宇宙 更新时间:2023-11-04 10:23:09 25 4
gpt4 key购买 nike

我们正在尝试从 RHEL 6.7 迁移到 RHEL 7.3 以及从 gcc 4.4.7 迁移到 gcc 4.8.5。

我们的静态变量(在类定义之外初始化)都没有被初始化。例如,在文件 unitprot_selfsintent.cc 中:

util_Registry<unitprot_SelfsIntent> * unitprot_SelfsIntent::d_selfsIntents = 
new util_Registry<unitprot_SelfsIntent>();

d_selfsIntents 在 unitprot_selfsintent.h 中声明为静态。

util_Registry 是一个模板类。我们第一次尝试在此注册表中放置某些内容时,应用程序核心转储。 d_selfsIntents 是一个 0 指针,还没有被初始化。

我本以为在我们尝试将某些内容放入注册表之前很久就已经完成了。

在旧配置下一切正常。在新配置中可能发生了什么变化导致了这种情况。我需要调用新的编译器选项吗?

更多信息...

另一个类unit_groundresunitc2.cc有一个静态变量定义如下:

static unitprot_Selfintent * f_en_route_to_escort =
unitprot_SelfsIntent::registerObject("en_route_to_escort");

unitprot_SelfsIntent::registerObject 看起来像这样:

unitprot_SelfsIntent * unitprot_SelfsIntent::registerObject(const char * si)
{
OTC_String selfsIntent(si);
return registerObject(selfsIntent);
}

使用 OTC_String 调用 registerObject 如下:

unitprot_SelfsIntent * unitprot_SelfsIntent::registerObject(const OTC_String & si)
{
unitprot_SelfsIntent * regObj = d_selfsIntents->find(si);

if (regObj == 0)
{
regObj = new unitprot_SelfsIntent(si);
d_selfsIntents->registerObject(regObj);
}

return regObj;
}

在作为 util_Registry 的 d_selfsIntents 上调用 find(const OTC_String & name) 会导致核心转储,因为 d_selfsIntents 尚未初始化。

所以为了回答 Matteo 的问题,是的,我们正在尝试从另一个静态构造 (f_en_route_to_escort) 的初始化访问一个静态构造 (d_selfsIntents)。

我看到在初始化另一个之前使用一个的问题。我可能有一个问题是为什么现在这是一个问题?他的提议听起来像是早该处理的事情。我们的代码有数百个这样的示例,并且已经开发超过 15 年,直到现在才出现问题。

什么设置顺序,编译器还是链接器?这里讨论的两个编译单元是 unitprot(用于 unitprot_SelfsIntent)和 util(用于 util_Registry)。我们确实按特定顺序编译它们,但我认为问题出现在链接时或运行时。

谢谢你,
斯格拉斯哥

最佳答案

我从问题中遗漏的一点是,您是在其他静态数据成员初始化期间还是在执行已经进入 main 之后尝试访问这些静态数据成员。

如果是第一种情况,请注意相对于在不同编译单元中定义的变量,变量的静态初始化不能保证以任何特定顺序发生。

可能有改进的技巧,但处理此问题的通常方法是在充当这些成员的公共(public) getter 的静态方法中完成初始化。简单来说,这相当于使用单例模式。

您的示例在 header 中将如下所示:

class unitprot_SelfsIntent : ...
{
public:
static util_Registry<unitprot_SelfsIntent>* GetSelfsIntents();
//...
private:
static util_Registry<unitprot_SelfsIntent>* d_selfsIntents;
//...
};

你的实现类似于:

util_Registry<unitprot_SelfsIntent>* unitprot_SelfsIntent::GetSelfsIntents()
{
// usually multithreading would be handled here

d_selfsIntents = new util_Registry<unitprot_SelfsIntent>();

// some more synchronization

return d_selfsIntents;
}

关于linux - 静态变量没有被初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42977323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com