如何解决析构函数用静态对象调用两次
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
解决方法
为什么会这样?
因为该变量被声明为static
。这意味着该变量具有内部链接。这意味着每个翻译单元都有自己的对象。您已经以两个转换单位定义了变量,因此有两个对象。
如果您不想这样做,则该变量不应为static
。一个简单的解决方案是改为声明inline
。这样,它就可以具有外部链接,同时仍可以在标题中进行定义。
P.S。小心静态初始化顺序失败。尽量避免使用静态存储变量,尤其是在名称空间范围内的变量。
,由于在标头中定义了相应的对象,因此内部链接具有两个静态变量
struct obj{
obj(){}
~obj(){cout<<"destroyed"<<endl;}
};
static obj x;
此标头包含在两个模块test1.cpp
和main.cpp
中。因此,每个模块都有其自己的静态变量x
。
如果您想要一个具有外部链接的对象,则在标题中声明它,例如
extern obj x;
并在以下模块之一中对其进行定义
obj x;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。