单例类实现问题

时间:2010-12-15 13:15:11

标签: c++ singleton

在代码1中声明了一个静态指针aSingletonClass * instance_和一个静态函数void deleteInstance(void)。

我在没有使用静态指针和静态函数的情况下实现了代码2(我认为没有它可以实现Singleton,但我不确定!!!)

请告诉我这种改变是否有危险,在哪种情况下我的程序可能会崩溃。

代码1:

class aSingletonClass
{
public:

  static aSingletonClass *getInstance( void )
  {

    if(!instance_)
      instance_ = new aSingletonClass;
    return instance_;
  }

  static void deleteInstance()
  {
    if(instance_)
      delete instance_;
    instance_ = NULL; //important as this can create dead reference problems
  }

private:

  static aSingletonClass *instance_;

  aSingletonClass() {};

  ~aSingletonClass() {};
};

int main()
{
  aSingletonClass *someVar = NULL;

  someVar = aSingletonClass::getInstance();

  aSingletonClass::deleteInstance();

  return 0;
}

代码2:

class A
{
    int x;
    A(int a)
    { x=a;  }

    ~A()
    { }

public:
     static A* start()
     {
       A* ptr1 = new A(3);
       return (ptr1);
     }


     void end()
     {
       delete this;
     }
};

int main()
{
  A* ptr=A::start();

  ptr->end();
}

4 个答案:

答案 0 :(得分:3)

您的第二个版本不是单例,因为您没有静态A*指针,只要在调用start()时返回一个新版本,因此以下内容在您的代码中有效:

int main()
{
    A* ptr = A::start();
    A* ptr2 = A::start();
    A* ptr3 = A::start();
    // etc
    ptr->end();
    ptr2->end();
    ptr3->end();
    return 0;
}; // eo main

答案 1 :(得分:3)

唉。做单身人士不是一个好方法!

我会做以下事情......

class A
{
private:
  A() {}

public:

  static A& instance()
  {
    static A _inst;
    return _inst;
  }

};

使用,

A& inst = A::instance()

将始终返回单个实例!

编辑:这种方法有几个优点 - 你不必担心清理,但它是懒惰加载(或初始化),你使用引用!哎呀,你甚至可以有一个不变的单身人士(为什么,我相信你能想到一些用途!;)

答案 2 :(得分:1)

代码2不是单身人士。在start()函数中,返回指向新A对象的指针。但是,在end()函数中,您删除此对象。所以,它不会起作用。

答案 3 :(得分:0)

您的代码应该是这样的:

class A    {
  public:
    static A *getInstance( void )
    {
       if(!instance_)
          instance_ = new A();
       return instance_;
    }
    static void deleteInstance()
    {
        if(instance_)
           delete instance_;
        instance_ = NULL; //important as this can create dead reference problems
    }
    static A* start()
    {
        A* ptr1 = A::getInstance();
        ptr1 -> started = true; // check here if A had been started already !!!!
        return (ptr1);
    }

    static void end()
    {
        A* ptr1 = A::getInstance();
        ptr1 -> started = false; // check here if A had ever been started !!!!
        //A::deleteInstance();      // may be it will be useful here
    }
  private:
    bool started = false;
    static A *instance_;
    A() {};
    ~A() {};
};

int main()
{
  A *someVar = NULL;
  someVar = aSingletonClass::getInstance();
  A::deleteInstance();

  return 0;
}