gpt4 book ai didi

c++ - 使用单例初始化程序

转载 作者:行者123 更新时间:2023-11-30 01:32:53 24 4
gpt4 key购买 nike

我已经阅读了多篇关于为什么单例不好的文章。
我知道它几乎没有像日志记录这样的用途,但初始化和取消初始化呢?
这样做有什么问题吗?
我有一个脚本引擎,我需要在启动时将其绑定(bind)到一个库。
图书馆没有 main() 那么我应该使用什么?
常规函数或单例。
能否以某种方式复制此对象:

class
{
public:
static void initialize();
static void deinitialize();

} bootstrap;

如果不是,为什么人们要隐藏复制构造函数、赋值运算符和构造函数?

最佳答案

C++ 中的库有一种更简单的方法来执行初始化和清理。这与您为其他任何事情所做的完全相同。 RAII.

将所有需要初始化的都包装在一个类中,在构造函数中进行初始化。瞧,问题解决了。

单例的所有常见问题仍然存在:

  • 将需要不止一个实例,即使您没有为此做好计划。如果不出意外,您将在单元测试时需要它。每个测试都应该从头开始初始化库,以便它在干净的环境中运行。使用单例方法很难做到这一点。
  • 一旦这些单例开始相互引用,您就完蛋了。因为实际的初始化顺序是不可见的,所以您很快就会得到一堆循环引用,导致访问未初始化的单例或堆栈溢出或死锁或其他有趣的错误 如果您没有这样做,这些错误可能会在编译时被捕获没有痴迷于让一切全局化
  • 多线程。强制所有线程共享一个类的同一个实例通常是一个坏主意,因为它强制该类锁定和同步所有,这会消耗大量性能,并可能导致死锁。
  • 意大利面条代码。每次使用单例或全局时,您都在隐藏代码的依赖项。不再清楚函数依赖于哪些对象,因为并非所有对象都作为参数可见。而且因为您不需要将它们添加为参数,所以您很容易最终添加比必要的更多的依赖项。这就是为什么一旦拥有单例就几乎不可能删除它们。

关于c++ - 使用单例初始化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com