【问题标题】: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.cppmain.cpp 中。所以每个模块都有自己的静态变量x

    如果您想拥有一个带有外部链接的对象,请在标题中声明它,例如

    extern obj x;
    

    并在类似的模块之一中定义它

    obj x;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2017-06-05
      • 2010-12-29
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 2014-11-29
      相关资源
      最近更新 更多