zoukankan      html  css  js  c++  java
  • 限制对象在堆或栈中声明

     

    ***********************************************声明************************************************************

          原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

          因为各种原因,可能存在诸多不足,欢迎斧正。

    ****************************************************************************************************************

         近期学习中,遇到一些平时非常少使用的C++语言知识。事实上扩展开去也不只限于C++语言知识,非常多面向对象的语言都会遇到类似的问题。今天结合资料做一下小结。也希望你可以帮助到有须要的朋友。

          通常对象能够定义在对或栈中。一般用new,malloc等函数或运算符声明的对象定义在堆中,其它的定义在栈中。

          栈区(stack):由编译器自己主动分配释放,存放函数的參数值,局部变量的值等,其组织方式类似于数据结构中的栈。


          堆区(heap):一般由程序猿分配释放,若程序猿不释放。程序结束时可能由OS回收。其组织方式方式倒是类似于链表。

    关于程序中内存空间的分配机制參见这篇文章点击

         栈上分配空间长处:高速高效,对象生命周期是自己主动的。离开作用域之后就自己主动析构回收。缺点是栈空间有限,并且不能人为控制对象的生存期,比方你无法将一个函数内部的栈上的对象返回,由于这个函数运行完成后栈空间会自己主动回收。
         堆上分配空间就相反。创建对象往往效率较低,且对堆对象的訪问也稍慢于栈对象。

    一旦创建成功,须要自己手动delete回收,系统不会帮你管理回收(用GC的除外)。可是分配空间大小灵活。并且正由于是手动回收的。你能够自由控制对象生存期。经常使用来跨域传递对象。

         普通情况下对象在堆还是栈上声明没有过多的要求,但有时须要明白指定定义方式,甚至是2选1。

    C++的重载机制+訪问控制机制,重载new运算符将其设成私有成员函数能够达到仅仅在栈上分配的目的;C++的訪问控制机制,将构造函数设为私有能够达到仅仅在堆上分配的目的。

    以下是一段辅助说明的源码:

    #include<iostream>
    using namespace std;
    
    
    class CHeapAndStack
    {
    public:
    	CHeapAndStack()
    	{
    		cout<<"Contructed  CHeapAndStack!"<<endl;
    	}
    	~CHeapAndStack()
    	{
    		cout<<"Destructed  CHeapAndStack!"<<endl;
    	}
    };
    
    
    class CHeapOnly 
    {
    public:
    	static CHeapOnly *CreateInstance()
    	{
    		return new CHeapOnly();
    	}
    
    private:
    	CHeapOnly()
    	{
    		cout<<"Constructed  CHeapOnly!"<<endl;
    	}
    };
    
    class CStackOnly 
    {
    private:
    	void * operator new(size_t size)
    	{
    		cout<<"Constructed  CStackOnly!"<<endl;
    	}
    };
    
    int main()
    {
    	CHeapAndStack heapAndStackA;
    	CHeapAndStack* heapAndStack=new  CHeapAndStack();
    
    	//CHeapOnly heapOnlyA;//编译出错
    	CHeapOnly *heapOnlyB = CHeapOnly::CreateInstance();
    
    
    	CStackOnly StackOnlyA;
    	//CStackOnly *StackOnlyB = new CStackOnly();//编译出错
    
    	system("pause");
    	return 0;
    }



       


  • 相关阅读:
    [LeetCode] 134. Gas Station Java
    [LeetCode] 22. Best Time to Buy and Sell Stock II Java
    [LeetCode] 55. Jump Game Java
    [LeetCode] 264. Ugly Number II Java
    [LeetCode] 331. Verify Preorder Serialization of a Binary Tree Java
    [LeetCode] 232. Implement Queue using Stacks Java
    java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory的解决办法
    Linux centos 连接网络
    MyEclipse默认编码为GBK,修改为UTF8的方法
    表单
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7223791.html
Copyright © 2011-2022 走看看