fisher_jiang的专栏

修身,齐家,治国,平天下

如何只在heap上创建对象,如何只在stack上建立对象?

只能在堆上创建的对象,代码如下  

 

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;
}

首先,我们把析构函数设为private,使得栈上创建的对象不能自动销毁,于是产生编译错误。
然后,我们“逼迫”用户只能使用new操作符来在heap上创建对象。然而又出现一个问题,你不能显式delete你创建的对象,因为delete会就地调用析构函数。所以你不能不提供一个类似“delete”的销毁函数destory,在函数内部delete掉对象。

只在Stack上创建对象:

 

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

对于new operator,语义就是先调用operator new(全局或者类重载)分配空间,然
后在分配好的空间上调用ctor,若ctor抛出异常,还要调用operator delete(与被
调用的operator new对应的版本,若存在)来释放空间,然后rethrow异常。

阅读更多
文章标签: delete
个人分类: C/C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭