【问题标题】:Destructor called twice with static object [duplicate]使用静态对象调用两次析构函数[重复]
【发布时间】:2020-12-25 19:32:27
【问题描述】:
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
【问题讨论】:
标签:
c++
c++11
c++14
destructor
【解决方案1】:
为什么会这样?
因为变量被声明为static。这意味着变量具有内部链接。这意味着每个翻译单元都有自己的对象。您已经在两个翻译单元中定义了变量,因此您有两个对象。
如果你不想要这个,那么变量不应该是static。一个简单的解决方案是将其声明为inline。这允许它具有外部链接,同时仍在标题中定义。
附:非常小心静态初始化命令惨败。尽量避免使用静态存储变量,尤其是命名空间范围内的变量。
【解决方案2】:
由于在标题中定义了相应的对象,因此您有两个具有内部链接的静态变量
struct obj{
obj(){}
~obj(){cout<<"destroyed"<<endl;}
};
static obj x;
此标头包含在两个模块 test1.cpp 和 main.cpp 中。所以每个模块都有自己的静态变量x。
如果您想拥有一个带有外部链接的对象,请在标题中声明它,例如
extern obj x;
并在类似的模块之一中定义它
obj x;