2017-10-09 54 views
0

我想在C++中创建一个简单的Singleton类,其中包含指向其他类型的指针。从单例类中删除对象

单身人士将在某个时刻成为该指针的所有者。

所以这是一个很好的方法来删除Test类型的对象并释放它在Singleton析构函数上的内存?

class Test{...}; 
class Singleton 
{ 
    public: 
    static Singleton& getInstance() 
    { 
     static std::unique_ptr<Singleton> instance(new Singleton()); 
     return *instance.get(); 
    } 

    void SetTest(Test* test); 
    Test* GetTest() const; 
    ... 
    private: 
     Singleton(){} 
     ~Singleton(){ if(test) delete test;} // ?? 
     Test* test; 
    ... 
}; 

PS:我不能使用智能指针作为Test对象。

+0

我猜你的意思是“指向其他类型的对象”,据我所知是没有指针类型 – user463035818

+1

你或许应该初始化'在构造函数中test'。否则,如果用户从不调用SetTest,那么GetTest将返回一个无效的指针,并且析构函数会尝试删除未分配的东西。 –

+3

严格来说,单身是反模式。而任何你需要它拥有的东西都可能代表你的代码中有更多的反模式。 – StoryTeller

回答

1

为了给出这个问题一些结论:是的,通常可以像您提议的那样删除对象。但是,请记住以下几点注意事项,已经被指出了评论:

  • 确保在单身的构造函数初始化testnullptr。否则,你最终可能会试图删除一个随机存储器地址。 (一些程序员哥们)
  • 你不需要在析构函数中检查nullptr。删除nullptr通常是安全的,不会做任何事情。 (Massimiliano Janes和here
  • 在您的情况下,可能会使用智能指针,这将是更可取的。 (有些程序员花花公子,简氏的Massimiliano)