析构函数用静态对象调用了两次



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.0os-ubuntu

为什么会发生这种情况?

因为变量被声明为static。这意味着变量具有内部链接。这意味着每个翻译单元都有自己的对象。您已经用两个转换单位定义了变量,因此您有两个对象。

如果您不希望这样,那么变量不应该是static。一个简单的解决方案是将其声明为inline。这允许它具有外部链接,同时仍在标题中定义。

附言:小心静态初始化命令Fiasco。尽可能避免使用静态存储的变量,尤其是命名空间范围内的变量。

由于在头中定义了相应的对象,因此有两个具有内部链接的静态变量

struct obj{
obj(){}
~obj(){cout<<"destroyed"<<endl;}
};
static obj x;

该报头包括在两个模块test1.cppmain.cpp中。因此,每个模块都有自己的静态变量x

如果您想要一个具有外部链接的对象,那么在头中声明它,如

extern obj x;

并在等模块中定义

obj x;

最新更新