只能在堆上生成的对象 VS. 只能在栈上生成的对象

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

posted @ 2015-08-05 14:28  Ryan in C++  阅读(280)  评论(0编辑  收藏  举报