C++ 在单例类中将成员指针设置为null的正确方法是什么

C++ 在单例类中将成员指针设置为null的正确方法是什么,c++,singleton,C++,Singleton,在myClass中,我有一个类型为helper的指针,我想将它设置为null 我可以在getInstance()函数中将其初始化为null,还是可以在声明本身中将其设置为null指针 将其设置为null的最佳方法是什么 class myClass { public: static myClass* getInstance(); static void destroy(); Helper* Helper_; private: static myClass* ins

myClass
中,我有一个类型为
helper
的指针,我想将它设置为
null

我可以在
getInstance()
函数中将其初始化为
null
,还是可以在声明本身中将其设置为
null
指针

将其设置为
null
的最佳方法是什么

class myClass
{
public:
    static myClass* getInstance();
    static void destroy();
    Helper* Helper_;
private:
    static myClass*  instancePtr_;
    // Private so that object can not be created outside
    myClass(){};
    ~myClass(){};
    myClass(const myClass&);
    myClass& operator =(const myClass&);
}

myClass* myClass::instancePtr_ = NULL;
myClass* myClass::getInstance()
{
    if (!instancePtr_)
    {
        instancePtr_ = new myClass;
    }
    return instancePtr_;
}
在myClass中,我有一个类型为helper的指针,我想将它设置为null

您可以在声明中对其进行初始化:

Helper* Helper_ = nullptr;
在C++11之前的模式中,在构造函数中初始化它:

myClass() : Helper_(NULL) {};
您还可以省略
NULL
初始值设定项,将其转换为,效果相同:

myClass() : Helper_() {};
在myClass中,我有一个类型为helper的指针,我想将它设置为null

您可以在声明中对其进行初始化:

Helper* Helper_ = nullptr;
在C++11之前的模式中,在构造函数中初始化它:

myClass() : Helper_(NULL) {};
您还可以省略
NULL
初始值设定项,将其转换为,效果相同:

myClass() : Helper_() {};

在静态初始化顺序失败会让生活变得艰难的框架中使用的习惯用法是让用户在例如
main()
中显式地构造对象,如果类需要真正成为单实例,则强制执行单实例。然后,构造函数应该使用初始值设定项列表(下面是C++03):

在C++11中,您可以编写:

class MyClassBase {};
class MyClass : private MyClassBase {
  MyClass(const MyClass &) = delete;
  MyClass & operator=(const MyClass &) = delete;
  static MyClassBase * m_instance;
  Helper * m_helper = {};
public:
  MyClass();
  ~MyClass();
  static MyClass * instance();
};

MyClass::MyClass() { ... }

MyClass::~MyClass() {
  if (m_instance != &null)
    m_instance = nullptr;
}

在静态初始化顺序失败会让生活变得艰难的框架中使用的习惯用法是让用户在例如
main()
中显式地构造对象,如果类需要真正成为单实例,则强制执行单实例。然后,构造函数应该使用初始值设定项列表(下面是C++03):

在C++11中,您可以编写:

class MyClassBase {};
class MyClass : private MyClassBase {
  MyClass(const MyClass &) = delete;
  MyClass & operator=(const MyClass &) = delete;
  static MyClassBase * m_instance;
  Helper * m_helper = {};
public:
  MyClass();
  ~MyClass();
  static MyClass * instance();
};

MyClass::MyClass() { ... }

MyClass::~MyClass() {
  if (m_instance != &null)
    m_instance = nullptr;
}

在构造函数中执行吗?我建议不要一开始就编写单例。从长远来看,它们总是弊大于利。是的,它是有效的。但这是唯一的方法吗'myClass*myClass::instancePtr_=NULL;'这通常是不必要的。全局变量和静态变量都在一个归零的内存区域中。在构造函数中执行吗?我建议不要开始编写单例。从长远来看,它们总是弊大于利。是的,它是有效的。但这是唯一的方法吗'myClass*myClass::instancePtr_=NULL;'这通常是不必要的。全局变量和静态变量都在一个归零的内存区域。@LearningCpp您用
c++11
tag标记了这个问题。啊,对不起。很抱歉。如何删除它,如果我不删除它,它不是内存泄漏吗?@LearningCpp最好的做法是将普通指针仅用作非拥有指针。否则,请使用智能指针,例如
std::unique\u ptr
或在C++11之前的版本中
boost::unique\u ptr
。在这种情况下,不需要将其显式初始化为
NULL
。更好的是,如果可能的话,按值存储
Helper
。@LearningCpp您用
c++11
tag.Aah标记了这个问题。抱歉。很抱歉。如何删除它,如果我不删除它,它不会是内存泄漏吗?@LearningCpp最佳做法是将普通指针仅用作非拥有指针。否则,请使用智能指针,例如
std::unique\u ptr
或在C++11之前的版本中
boost::unique\u ptr
。在这种情况下,不需要将其显式初始化为
NULL
。如果可能,最好按值存储
Helper