使用静态对象调用两次析构函数
Destructor called twice with static object
test1.hpp
struct obj{
obj(){}
~obj(){cout<<"destroyed"<<endl;}
};
static obj x;
test1.cpp
#include "test1.hpp"
main.cpp
#include "test1.hpp"
int main(){...}
析构函数被调用了两次,为什么会这样?
gcc-7.5.0
os-ubuntu
why is this happening?
因为声明了变量static
。这意味着变量具有内部链接。这意味着每个翻译单元都有自己的 object。您已经在两个翻译单元中定义了变量,因此您有两个 objects.
如果您不想要这个,那么变量不应该是 static
。一个简单的解决方案是改为声明它 inline
。这允许它具有外部链接,同时仍然在 header.
中定义
P.S。非常小心 Static Initialisation Order Fiasco。尽可能避免静态存储变量,尤其是命名空间范围内的变量。
由于在 header
中定义了相应的 object,您有两个具有内部链接的静态变量
struct obj{
obj(){}
~obj(){cout<<"destroyed"<<endl;}
};
static obj x;
此 header 包含在两个模块 test1.cpp
和 main.cpp
中。所以每个模块都有自己的静态变量x
.
如果你想要一个带有外部链接的 object 然后在 header 中声明它,比如
extern obj x;
并在
等模块之一中定义它
obj x;
test1.hpp
struct obj{
obj(){}
~obj(){cout<<"destroyed"<<endl;}
};
static obj x;
test1.cpp
#include "test1.hpp"
main.cpp
#include "test1.hpp"
int main(){...}
析构函数被调用了两次,为什么会这样?
gcc-7.5.0
os-ubuntu
why is this happening?
因为声明了变量static
。这意味着变量具有内部链接。这意味着每个翻译单元都有自己的 object。您已经在两个翻译单元中定义了变量,因此您有两个 objects.
如果您不想要这个,那么变量不应该是 static
。一个简单的解决方案是改为声明它 inline
。这允许它具有外部链接,同时仍然在 header.
P.S。非常小心 Static Initialisation Order Fiasco。尽可能避免静态存储变量,尤其是命名空间范围内的变量。
由于在 header
中定义了相应的 object,您有两个具有内部链接的静态变量struct obj{
obj(){}
~obj(){cout<<"destroyed"<<endl;}
};
static obj x;
此 header 包含在两个模块 test1.cpp
和 main.cpp
中。所以每个模块都有自己的静态变量x
.
如果你想要一个带有外部链接的 object 然后在 header 中声明它,比如
extern obj x;
并在
等模块之一中定义它obj x;