C++避免全局变量和Singleton

C++ Avoiding Global Variables and Singletons

本文关键字:Singleton 全局变量 C++      更新时间:2023-10-16

我最近一直在尝试从我的项目中删除singleton和全局变量的使用,但我很难做到这一点。我在某种程度上设计了一个更好的singleton和全球变量的替代方案,但我不确定在我的应用程序终止后如何处理数据。

我的应用程序需要访问几件事,大多数组件才能正常工作;一些组件需要访问CCD_ 1,而另一些组件需要接入CCD_。我所做的是为这些向量创建"管理器",一个FooManager为继承它的类提供对受保护静态向量的访问权限,一个BobManager为其他向量做同样的事情。这样做限制了这两个对象的范围。我的问题是在进程终止时,如何以及在哪里释放每个向量中的指针?多个类现在是这些对象的"管理器"。从派生类?但是,如果我在另一个类需要原始数据的时候解除分配一些东西,该怎么办?

基本上,我的问题是,当我不应该删除指针时,我该如何避免删除指针?unique_ptr?shared_ptr?此外,欢迎采取任何其他措施。

如果你在设计中有选择权,Idan的最后一段就是你的选择(再次包含):

如果你仍然坚持避免辛格尔顿模式,我会怎么做建议将这些向量再次设置为非静态,创建一个每个经理在您的主要职能部门或任何其他部门的一次实例root-ish函数,并将它们传递给任何其他需要它们的对象。是的,这是一项艰巨的工作,但它可以让你控制向量(以及它们指向的对象)被创建和销毁。或者-你可以只用单身汉。

您的问题:

基本上,我的问题是,当我不应该是吗?unique_ptr?shared_ptr?以及这是受欢迎的。

引用计数是解决问题的一种方法。它跟踪对一组数据感兴趣的事物的数量。一个快速的方法(对于您当前的实现)是在管理器类中包含一个变量,以跟踪有多少实例。在析构函数中递减计数器。如果计数器为0,则删除向量。

如果我理解正确的话,您有两个需要全局访问的向量,并且您曾经有单独的向量来处理每个向量。现在,您想删除那些singleton,而不是使这些向量成为静态成员,并拥有Manager类的许多实例?

不要。只是不要。

全局变量是个问题。有一种误解认为单态是一种全局变量,因此也是一个问题。它们不是-单态是全局变量问题的。删除解决方案并不意味着删除问题,它只是意味着你有问题而没有解决方案。

如果您仍然坚持避免Singleton模式,我建议您再次使这些向量非静态,在main函数或任何其他根函数上创建每个管理器的单个实例一次,并将它们传递给任何其他需要它们的对象。是的,这是一项艰巨的工作,但它可以让你控制何时创建和销毁这些向量(以及它们指向的对象)。或者,你可以只使用单身汉。