gpt4 book ai didi

c++ - 在 C++ 中,静态对象可以比其静态成员变量长寿吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:22 25 4
gpt4 key购买 nike

关于C++中静态变量的销毁顺序,静态对象的静态成员变量的生命周期是否有任何保证?

例如,如果我有这样的东西(仅用于演示目的的疯狂简化示例):

class Object {
static std::vector< Object * > all_objects;

public
Object() {
all_objects.push_back( this );
}

~Object() {
all_objects.erase(
std::remove(all_objects.begin(), all_objects.end(), this),
all_objects.end());
}
};

对于不同编译单元中的静态对象,这是否“安全”?也就是说,是否可以保证 all_objects 成员变量至少与任何有效对象一样长,或者是否存在 all_objects 在之前被销毁的问题最后一个对象实例?

如果代码被用作库(比如在 Python 中)而不是作为具有自己的 main() 的独立程序,答案会改变吗?

最佳答案

Would this be "safe" with respect to static Objects in different compilation units?

初始化时不安全。无法保证 all_objects 会在构建编译单元中的 static 对象时被初始化。

我不清楚终止顺序。我的猜测是破坏的发生顺序与 build 的顺序相反。如果构造/初始化不安全,那么销毁也可能不安全。

在初始化时使其安全的一种方法是将 all_objects 包装在一个函数中。

class Object {
static std::vector<Object *>& get_all_objects();

public
Object() {
get_all_objects().push_back( this );
}

~Object() {
std::vector<Object *>& all_objects = get_all_objects();
all_objects.erase(
std::remove(all_objects.begin(), all_objects.end(), this),
all_objects.end());
}
};

std::vector<Object *>& Object::get_all_objects()
{
static std::vector<Object *> all_objects;
return all_objects;
}

这就是 C++11 标准 (3.6.3/1) 关于销毁具有静态存储持续时间的对象的说法。

If the completion of the constructor or dynamic initialization of an object with static storage duration is sequenced before that of another, the completion of the destructor of the second is sequenced before the initiation of the destructor of the first.

鉴于此,上述方法对于销毁是安全的all_objects 只有在最后一个 Object 被销毁后才会被销毁。

关于c++ - 在 C++ 中,静态对象可以比其静态成员变量长寿吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39539577/

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