C ++单与私有构造函数(C++ singleton with private constructo

2019-10-18 14:54发布

我需要单与应用生命周期,保证创建/破坏和它静态访问。

#include <iostream>
#include <cstdlib>

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
    TypeName(const TypeName&);             \
    void operator=(const TypeName&)

#define M() C::sM()
#define M2() C::sM2()

using namespace std;

class C {
  private:
    static C* s;

    ~C() { cout << "~C()" << endl; }
    static C* instance() { 
        if (s==NULL) { s=new C(); }
        cout << "instance()=" << s << endl; return s; 
    }
    static void cleanUp() { delete s; }
    void m() { cout << "m()" << endl; }
    void m2() { cout << "m2()" << endl; }
    DISALLOW_COPY_AND_ASSIGN(C);
  public:
    C() { 
        cout << "C()" << endl; if (s==NULL) { 
            s=this; atexit(&cleanUp); 
            cout << "cleanUp is installed" << endl; 
        } else { 
            cout << "cleanUp is not installed" << endl; 
        } 
    }
    void* operator new(size_t sz) { 
        void* p=NULL; if (s==NULL) { p=new char[sz]; } else { p=s; }
        cout << "new(" << sz << ")=" << p << endl;
        return p;
    }
    void operator delete(void* p, size_t sz) { 
        cout << "delete(" << sz << "," << p << ")" << endl;
        if (p) delete[] static_cast<char*>(p); s=NULL; 
    }
    void static sM() { cout << "sM()" << endl; instance()->m(); }
    void static sM2() { cout << "sM2()" << endl; instance()->m2(); }
};

C* C::s = NULL;

int main() {
    M();
    M2();
    C* p1 = new C();
    C* p2 = new C();
}  

但我不知道如何摆脱G ++警告:

test.cpp: In static member function 'static void C::operator delete(void*, size_t)':
test.cpp:22: warning: deleting 'void*' is undefined

如果我写的C *而不是无效*,析构函数开始自称在无限循环。 任何人都可以帮我弄干净代码,而无需警告? C套餐的++ 98。

Answer 1:

要删除的类型是char*

void operator delete(void* p, size_t sz) { 
    cout << "delete(" << sz << "," << p << ")" << endl;
    if (p) delete (char*) p;
}

有一个在你的新的错误: (10)有什么新的char [10]和新的char的区别

也许应该是:

p=new char[sz];

接着

delete[] (char*)p ;

----编辑:

该删除纯化论者,牺牲清晰度人们学习,P:

delete[] static_cast<char*>(p) ;

(*其实我欣赏的演员的说明)



Answer 2:

我以前写单身(当我真的需要一个)是这样的:

class Singleton
{
public:
     static Singleton& instance()
     {
          static Singleton theInstance;
          return theInstance;
     }

private:
     Singleton()
     {
     }
};

无需更动重载newdelete



Answer 3:

你并不需要重载没有new()也不delete() 你也许并不需要一个指针分发给您的客户。 参考就行了。

单身的建设和破坏会在你做instance()它可能看起来像这样:

static C& instance() {
  static C _instance;
  cout << "instance()" << endl; 
  return _instance; 
}

这保证了建设与破坏,因为当第一个用户调用C的构造函数instance()只有第一次调用。 破坏将发生在你的程序结束。



Answer 4:

它看起来对我来说,你的代码应该工作,如果你只是删除了newdelete重载(我实在不明白的一点,如果你想记录每一个CON /销毁,在CON /析构函数这样做),但下面应该改正错误。

既然你指定char*p ,浇铸成char*在删除应该工作,即delete (char*)p;

不过,我相信p=new char(sz); 正在与的值的炭sz代替大小的字符数组sz 。 对于后者,则可能需要p=new char[sz]; 然后delete[] pdelete[] (char*)p;



文章来源: C++ singleton with private constructor