C++避免全局变量和Singleton
C++ Avoiding Global Variables and Singletons
我最近一直在尝试从我的项目中删除singleton和全局变量的使用,但我很难做到这一点。我在某种程度上设计了一个更好的singleton和全球变量的替代方案,但我不确定在我的应用程序终止后如何处理数据。
我的应用程序需要访问几件事,大多数组件才能正常工作;一些组件需要访问CCD_ 1,而另一些组件需要接入CCD_。我所做的是为这些向量创建"管理器",一个FooManager为继承它的类提供对受保护静态向量的访问权限,一个BobManager为其他向量做同样的事情。这样做限制了这两个对象的范围。我的问题是在进程终止时,如何以及在哪里释放每个向量中的指针?多个类现在是这些对象的"管理器"。从派生类?但是,如果我在另一个类需要原始数据的时候解除分配一些东西,该怎么办?
基本上,我的问题是,当我不应该删除指针时,我该如何避免删除指针?unique_ptr?shared_ptr?此外,欢迎采取任何其他措施。
如果你在设计中有选择权,Idan的最后一段就是你的选择(再次包含):
如果你仍然坚持避免辛格尔顿模式,我会怎么做建议将这些向量再次设置为非静态,创建一个每个经理在您的主要职能部门或任何其他部门的一次实例root-ish函数,并将它们传递给任何其他需要它们的对象。是的,这是一项艰巨的工作,但它可以让你控制向量(以及它们指向的对象)被创建和销毁。或者-你可以只用单身汉。
您的问题:
基本上,我的问题是,当我不应该是吗?unique_ptr?shared_ptr?以及这是受欢迎的。
引用计数是解决问题的一种方法。它跟踪对一组数据感兴趣的事物的数量。一个快速的方法(对于您当前的实现)是在管理器类中包含一个变量,以跟踪有多少实例。在析构函数中递减计数器。如果计数器为0,则删除向量。
如果我理解正确的话,您有两个需要全局访问的向量,并且您曾经有单独的向量来处理每个向量。现在,您想删除那些singleton,而不是使这些向量成为静态成员,并拥有Manager类的许多实例?
不要。只是不要。
全局变量是个问题。有一种误解认为单态是一种全局变量,因此也是一个问题。它们不是-单态是全局变量问题的解。删除解决方案并不意味着删除问题,它只是意味着你有问题而没有解决方案。
如果您仍然坚持避免Singleton模式,我建议您再次使这些向量非静态,在main
函数或任何其他根函数上创建每个管理器的单个实例一次,并将它们传递给任何其他需要它们的对象。是的,这是一项艰巨的工作,但它可以让你控制何时创建和销毁这些向量(以及它们指向的对象)。或者,你可以只使用单身汉。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++线程不检测全局变量更改
- C++避免全局变量和Singleton
- c++:logger类,不带全局变量或singleton,或将其传递给每个方法