该问题的一般答案是使用::std::shared_ptr
。或者如果你没有那个,::std::tr1::shared_ptr
,或者如果你没有那个,::boost::shared_ptr
。
你的具体情况,我建议的几种不同的方法之一:
一种可能性是,当然,shared_ptr的方法。你基本上把你的指针传给每个需要这个对象的人,当它们不再需要它时,它会自动销毁。虽然如果你的纹理管理器最终会指向指向它的对象的指针,那么你正在创建一个引用循环,并且这必须非常仔细地处理。
另一种可能性就是将其声明为main
中的局部变量,并将其作为指针或引用传递给需要它的所有人。在你的程序完成之前,它不会消失,你不必担心管理生命周期。在这种情况下,裸指针或引用就好了。
第三种可能性是类似单身人士那种模糊的可接受用法之一。这值得详细解释。
你做一个单身人士只是工作是分发有用的指针。它具有的一个关键特性是能够告诉它将指针指向什么东西。这有点像全球可配置的工厂。
这使您可以摆脱一般单身人士创造的巨大测试问题。只要告诉它在需要测试时就发出一个指向存根对象的指针。
它也允许你逃离访问控制/安全问题(是的,它们也会产生安全问题),单身人士代表出于同样的原因。您可以暂时告诉它传递一个指向一个对象的指针,该对象不允许访问您即将执行的代码段不需要访问的内容。这个想法通常被称为最低权力原则。
使用此功能的主要原因是,它可以节省您找出谁需要您的指针并将其交给他们的问题。这也是不使用它的主要原因,认为通过对你有好处。你还介绍了这样一种可能性,即由于你没有预料到的控制流,两个预期会得到与纹理管理器相同指针的事物实际上会获得指向不同纹理管理器的指针,这基本上是导致你的粗糙思维的结果首先使用Singleton。最后,单身人士是如此可怕,即使这种更温和的使用他们也会让我发痒。
个人而言,你的情况,我建议的方法#2,只是main
创建它在堆栈上,并传递一个指针,无论它的需要。它会让你更仔细地考虑你的程序结构,而这种对象应该可以适用于整个程序的整个生命周期。
为什么不直接声明你的texture_manager的全局实例?如果处理正确,全局并不是邪恶的。而且它们在线程化环境中的危险性不及任何其他实例传递给多个客户端...... – Mordachai