1. 只能在堆上
即禁止在栈上生成。如何实现?
当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。
所以,只需把类的析构函数声明为private即可禁止该类在栈上生成对象。但是别忘了提供一个public的函数用于析构。
1 class A { 2 public: 3 A(){} 4 void destroy() { 5 delete this; 6 } 7 private: 8 ~A(){} 9 };
缺点&follow up: http://blog.csdn.net/szchtx/article/details/12000867
2. 只能在栈上
即禁止在堆上生成。
只有使用new运算符,对象才会建立在堆上。因此,只要禁用new运算符就可以实现类对象只能建立在栈上。因此将运算符new和delete设为private即可。
1 class A { 2 public: 3 A(){} 4 ~A(){} 5 private: 6 void* operator new(size_t size) {} //void* 7 void operatordelete(void* ptr) {} //void 8 };
注意:new运算符的返回值类型是void* , delete的返回值类型是void。别弄错了。
另外,new的参数是size_t, delete的参数是void*.
ref1: http://www.nowcoder.com/questionTerminal/0a584aa13f804f3ea72b442a065a7618
ref2: http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5633611