限制对象在堆或栈中声明
来源:互联网 发布:照相馆制作照片软件 编辑:程序博客网 时间:2024/05/16 12:23
***********************************************声明************************************************************
原创作品,出自 “晓风残月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;}
- 限制对象在堆或栈中声明
- 如何限制对象在栈或堆中创建对象
- [C++]限制一个类的对象只能在栈或堆上创建
- 如何限制C++类的对象只能建立在堆上或栈上
- 要求或禁止在堆中产生对象
- 要求或禁止在堆中产生对象
- 要求或禁止在堆中产生对象
- 要求或禁止在堆中产生对象
- 要求或禁止在堆中产生对象
- 限制对象只能在堆上产生
- C++ 中只能在堆或栈上创建的对象
- C++中栈和堆的区别及区分对象存储在堆或栈中的方法
- 只能在栈上或堆上创建对象
- 只能在堆或栈上创建对象?
- 只能在堆或栈上创建对象?
- C++只在栈或堆上实例化对象
- 不止于在栈上或堆上创建对象
- 只能在堆或栈上创建对象
- atitit.404错误的排查流程总结vOa6
- RSA机密的原理
- Android应用如何适配不同分辨率的手机
- 2014/10/7 闹中修静--静心
- 对c语言中printf函数的个人理解
- 限制对象在堆或栈中声明
- actionsheet按钮序号
- 预期投资理财收益
- 易信每月送90分钟/月通话
- 深入HRESULT与Windows Error Codes的区别详解
- jstl标签库例子解析
- BCG属性列表
- 安卓第一课:通过一个简单的MP3播放器来认识安卓开发【下】
- 移动开发(IOS) – 多线程