zoukankan      html  css  js  c++  java
  • [C++]怎样将C++对象分配在堆/栈上

    相信一些朋友也碰见过这样的面试题目,本文尝试着给出解答.

    1. 分配对象在堆上

      那么,必然要禁止对象在栈上面分配.一个很简单的办法,就是构造函数私有化(提供额外的接口生成对象),那么在栈上面就不可以分配.可是我们还需要这个对象要被析构,那么可以提供一个接口,显式的释放掉这个接口,也就是说delete也得给他禁掉~~~

      考虑另外一个问题,C++有placement new,我自己new一块内存,然后在你这上面构造.问题就变得很恶心,看来我们只有把new,delete都给他禁掉...

      好了,我们现在知道该怎么做:

    • createInstance()接口产生对象
    • dispose()接口销毁对象
    • new/delete操作符全部不可见

    来看我们的代码:

    class HeapObject{
    public:
    	static HeapObject* createInstance()
    	{
    		return new HeapObject;
    	}
    	void dispose()
    	{
    		delete this;
    	}
    protected:
    	HeapObject(){}
    	~HeapObject(){}
    
    	static void* operator new (std::size_t size) throw (std::bad_alloc)
    	{
    		return ::operator new(size);
    	}
    	static void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
    	static void* operator new (std::size_t size, void* ptr) throw();
    	static void* operator new[] (std::size_t size) throw (std::bad_alloc);
    	static void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
    	static void* operator new[] (std::size_t size, void* ptr) throw();
    
    	static void operator delete (void* ptr) throw ()
    	{
    		::operator delete(ptr);
    	}
    	static void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();
    	static void operator delete (void* ptr, void* voidptr2) throw();
    
    	static void operator delete[] (void* ptr) throw ();
    	static void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) throw();
    	static void operator delete[] (void* ptr, void* voidptr2) throw();
    };
    

    2. 分配对象在栈上

      只能分配对象在栈上面,那么new显然是不能用的,否则就是在堆上面分配对象了,理所当然,delete也得禁掉.

    class StackObject
    {
    public:
    	StackObject(){}
    	~StackObject(){}
    protected:
    	static void* operator new (std::size_t size) throw (std::bad_alloc);
    	static void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
    	static void* operator new (std::size_t size, void* ptr) throw();
    	static void* operator new[] (std::size_t size) throw (std::bad_alloc);
    	static void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
    	static void* operator new[] (std::size_t size, void* ptr) throw();
    
    	static void operator delete (void* ptr) throw ();
    	static void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();
    	static void operator delete (void* ptr, void* voidptr2) throw();
    
    	static void operator delete[] (void* ptr) throw ();
    	static void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) throw();
    	static void operator delete[] (void* ptr, void* voidptr2) throw();
    };
    

    比较需要注意的地方是,new/delete有多个重载,算上[]的话,就是3*2*2=12个操作符.....

  • 相关阅读:
    在yii中使用Filter实现RBAC权限自动判断
    关于WEB设计透明和阴影
    一句话扯扯数据结构的概念点
    Console API Google 浏览器开发人员工具使用
    git提交项目时候,忽略一些文件
    学习笔记 如何解决IE6 position:fixed固定定位问题{转载}
    [转载]yii jquery折叠、弹对话框、拖拽、滑动条、ol和ul列表、局部内容切换
    Jquery 常用方法经典总结【砖】
    PHP中冒号、endif、endwhile、endfor这些都是什么
    [转载]救命的PHP代码
  • 原文地址:https://www.cnblogs.com/egmkang/p/2224529.html
Copyright © 2011-2022 走看看