1

我最近一直在尝试从我的项目中删除单例和全局变量的使用,但我很难做到这一点。我已经设计了一个更好的替代单例和全局变量的方法,但是我不确定一旦我的应用程序终止后如何处理数据。

我的应用程序需要访问一些东西才能使大多数组件正常工作;有些组件需要访问static std::vector<Foo*> foos;,有些组件需要访问static std::vector<Bob*> bobs;,有些需要同时访问。我所做的是为这些向量创建了“管理器”,一个 FooManager 可以访问受保护的静态向量到一个继承它的类,一个 BobManager 对另一个向量执行相同的操作。通过这样做限制了这两个对象的范围。我的问题是在进程终止时如何以及在哪里解除分配每个向量中的指针?多个类现在是这些对象的“管理者”。从派生类?但是如果我在另一个类需要原始数据时释放了一些东西怎么办?

基本上我的问题是如何避免删除不应该删除的指针?唯一的_ptr?shared_ptr? 也欢迎任何其他实现。

4

2 回答 2

1

如果您在设计中有选择权,那么 Idan 的最后一段就是要走的路(再次包括在内):

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

你的问题:

基本上我的问题是如何避免删除不应该删除的指针?唯一的_ptr?shared_ptr? 也欢迎任何其他实现。

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

于 2013-02-07T02:33:03.230 回答
0

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

不。只是……不要。

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

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

于 2013-02-07T01:36:56.557 回答