【发布时间】:2016-11-02 23:12:31
【问题描述】:
这个程序:
#include <iostream>
struct Foo {
Foo() {
std::cout << "Foo()\n";
}
~Foo() {
std::cout << "~Foo()\n";
}
};
struct Bar {
Bar() {
std::cout << "Bar()\n";
}
~Bar() {
std::cout << "~Bar()\n";
thread_local Foo foo;
}
};
Bar bar;
int main() {
return 0;
}
打印
Bar()
~Bar()
Foo()
对我来说(GCC 6.1、Linux、x86-64)。 ~Foo() 永远不会被调用。这是预期的行为吗?
【问题讨论】:
-
合法与否,你为什么要这么做?
-
@DavidHaim 我正在尝试实现
libc++abi的一部分(特别是__cxa_thread_atexit()),并且很好奇我是否应该处理这种情况。 -
这可能只是
cout在foo之前被销毁。尝试从Foo的析构函数中抛出异常,看看是否调用了std::terminate。 -
@BaummitAugen 请参阅en.cppreference.com/w/cpp/io/ios_base/Init,了解 C++ 如何解决
std::c{in,out,err}的初始化顺序惨败 -
@BrianCain: 是的,这与当前的语言演变是一致的,其目的是考虑在 之前 静态销毁所有线程局部变量,以便线程局部析构函数可以依赖关于静态对象的存在。
标签: c++ multithreading c++11 language-lawyer thread-local-storage