只能在栈上或者堆上创建的对象

本文介绍了一种编程技巧,通过将构造函数和析构函数设为私有或重载new/delete操作符来限制类实例只能在堆或栈上创建。这是一种防止不当使用类实例的有效手段。

今天在这里面看到了这个题目,据说还是Google面试题。

http://www.cnblogs.com/chio/archive/2007/10/23/934335.html

 

总的思想,是把一些在栈上或者堆上面创建对象,所必须的函数设为private使得编译报错。

 

比如:

只能在堆上创建,不能在栈上创建。因为栈上的对象,总是要调用析构函数。所以把析构函数设为private,然后new出来的对象,显式的调用delete就可以了。

class HeapOnly
{
public:
    void destroy() const
    {
        delete this;
    }

private:
    ~HeapOnly(){};

};

int main()
{
    //HeapOnly obj;
    HeapOnly *pobj = new HeapOnly;
    //do things
    pobj->destroy();
    //delete pobj;

    return 0;
}

 

也提到Singleton里面的那样方式,把构造函数放进private。但是那样不管直接new,还是在栈上面创建对象,都不能成功。

 

不能在堆上创建,只能在栈上面创建的对象。

就是把new和delete操作符重载为private。

 

class  OnlyStack 
{  
public:  
     OnlyStack(){}  
private:  
     void* operator new(size_t  );
     void operator  delete(void*ptr); 
     // 
}  
 
int main(  int  argc,  char*  argv[]  )  
{  
    OnlyStack obj; //  OK  
    //OnlyStack *pobj = new OnlyStack;//  Error  

 

转载于:https://www.cnblogs.com/charlesblc/p/6475580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值