Singleton:析构函数如何被两次调用?

弗拉顿

我问一个问题,关于单执行几分钟前,我从@LightnessRacesinOrbit得到了很好的答案。

但是我不明白为什么在下一个示例中,如果我Singleton在变量中实例化inst其析构函数调用两次?

#include <iostream>

class Singleton
{
public:
    ~Singleton()  { std::cout << "destruction!\n"; }

    static Singleton& getInstance() 
    {
        static Singleton instance;
        return instance;
    }

    void foo() { std::cout << "foo!\n"; }

private:
    Singleton() { std::cout << "construction!\n"; }
};

int main()
{
    Singleton inst = Singleton::getInstance();
    inst.foo();
}

输出:

construction!
foo!
destruction!
destruction!

现场演示

更准确地说,我理解为什么要两次调用它。但是我不明白,如果在第一个析构函数之后该类的实例被销毁了,怎么可以两次调用它呢?为什么没有例外?

还是没有摧毁?为什么?

科里·克莱默(Cory Kramer)

这条线

Singleton inst = Singleton::getInstance();

应该

Singleton& inst = Singleton::getInstance();

然后,您只会看到一个析构函数调用。

编写方式Singleton::getInstance()返回一个引用,然后将其复制inst因此,Singleton从函数返回的内容副本均被销毁。您从未见过要构造副本,因为没有使用默认构造函数,而使用了副本构造函数。

在第二种方法中,将返回引用,那么您只需inst对其进行引用即可,Singleton而不是进行复制。

正如其他人提到的那样,您可以使该类不可复制且不可移动,以防止这种情况发生。

Singleton(Singleton const&) = delete;             // Copy construct
Singleton(Singleton&&) = delete;                  // Move construct
Singleton& operator=(Singleton const&) = delete;  // Copy assign
Singleton& operator=(Singleton &&) = delete;      // Move assign

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

析构函数调用两次

来自分类Dev

为什么析构函数被调用两次?

来自分类Dev

为什么析构函数调用两次表单?

来自分类Dev

为什么代码两次调用析构函数?

来自分类Dev

为什么析构函数被调用两次而构造函数仅被调用一次?

来自分类Dev

为什么将异常的析构函数调用两次?

来自分类Dev

为什么自动对象的析构函数被调用两次?

来自分类Dev

在循环内部创建的返回变量导致析构函数被调用两次

来自分类Dev

vector :: emplace_back结果两次调用析构函数

来自分类Dev

为什么std :: shared_ptr两次调用我的析构函数?

来自分类Dev

为什么该程序中的析构函数被调用两次?

来自分类Dev

为什么析构函数被两次调用时我的程序不会崩溃

来自分类Dev

参考计数器和析构函数被调用两次

来自分类Dev

为优化级别为 0 的 std::vector 调用两次析构函数

来自分类Dev

为什么要尝试两次查找析构函数?

来自分类Dev

析构函数调用

来自分类Dev

如何指定析构函数调用的顺序?

来自分类Dev

为什么析构函数被调用三次?

来自分类Dev

从析构函数调用BeginInvoke

来自分类Dev

如何从析构函数调用const成员函数

来自分类Dev

使用Vector创建对象时如何调用析构函数

来自分类Dev

您如何测试是否将调用Ruby析构函数?

来自分类Dev

如何跟踪析构函数在哪里被调用-C ++

来自分类Dev

如何在链表中对析构函数进行递归调用?

来自分类Dev

如何理解CPP中的调用析构函数方法?

来自分类Dev

如何显式调用 std 迭代器的析构函数?

来自分类Dev

关于析构函数调用,堆栈展开如何工作?

来自分类Dev

析构函数调用究竟是如何进行的

来自分类Dev

std:map析构函数会调用键析构函数还是值析构函数?

Related 相关文章

  1. 1

    析构函数调用两次

  2. 2

    为什么析构函数被调用两次?

  3. 3

    为什么析构函数调用两次表单?

  4. 4

    为什么代码两次调用析构函数?

  5. 5

    为什么析构函数被调用两次而构造函数仅被调用一次?

  6. 6

    为什么将异常的析构函数调用两次?

  7. 7

    为什么自动对象的析构函数被调用两次?

  8. 8

    在循环内部创建的返回变量导致析构函数被调用两次

  9. 9

    vector :: emplace_back结果两次调用析构函数

  10. 10

    为什么std :: shared_ptr两次调用我的析构函数?

  11. 11

    为什么该程序中的析构函数被调用两次?

  12. 12

    为什么析构函数被两次调用时我的程序不会崩溃

  13. 13

    参考计数器和析构函数被调用两次

  14. 14

    为优化级别为 0 的 std::vector 调用两次析构函数

  15. 15

    为什么要尝试两次查找析构函数?

  16. 16

    析构函数调用

  17. 17

    如何指定析构函数调用的顺序?

  18. 18

    为什么析构函数被调用三次?

  19. 19

    从析构函数调用BeginInvoke

  20. 20

    如何从析构函数调用const成员函数

  21. 21

    使用Vector创建对象时如何调用析构函数

  22. 22

    您如何测试是否将调用Ruby析构函数?

  23. 23

    如何跟踪析构函数在哪里被调用-C ++

  24. 24

    如何在链表中对析构函数进行递归调用?

  25. 25

    如何理解CPP中的调用析构函数方法?

  26. 26

    如何显式调用 std 迭代器的析构函数?

  27. 27

    关于析构函数调用,堆栈展开如何工作?

  28. 28

    析构函数调用究竟是如何进行的

  29. 29

    std:map析构函数会调用键析构函数还是值析构函数?

热门标签

归档