c++学习之--关于堆栈理解
2013-11-17 15:09
411 查看
运算符重载7~重载赋值运算符.cpp这个代码涉及到释放2次堆内存导致运行错误。
查阅了关于堆栈的一些资料,下面写一下关于堆栈的理解。
先下一个定义:
堆内存是区别于栈,全局数据区和代码区的拎一个内存区域,堆允许程序动态的申请某个大小的内存空间。
做一个比喻:
堆内存就好比自己动手做自己喜欢吃的菜。(必须事事亲力亲为)
栈内存就好比去饭店吃饭只管点菜(发出申请),吃和付账(使用),其他的一些如做菜,吃完后的洗盘子等等都不需要管。好处是方便快捷,但是自由度小。
操作系统中所说的堆内存和栈内存在操作上就具有上述的特点。这里的堆内存和栈内存实际上就是满足堆内存性质的一种数据结构,优先队列,第一个元素具有最高的优先权。栈就是指满足先进后出的数据结构。
一些函数 获取堆内存 malloc() 释放用free() New 和 delete。
我们掌握的堆内存的权柄就是返回的指针,一旦丢掉了指针,使无法在我们的视野内释放它,这边是内存泄露。所以我们使用完了内存空间之后,要记得释放掉。
关于内存泄露,如果不停地申请但是不记得释放,内存就会越来越少,很明显的会使系统变慢或申请不到新的堆内存,过度的申请会使应用程序崩溃。但是关闭程序后操作系统会自动的回收那些内存。
堆内存是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是由链表来存储空闲内存地址的,自然是不连续的,而链表是由低地址向高地址的。堆内存的大小受限于计算机系统中的虚拟内存,由此可见堆内存获取空间比较大和灵活,容易产生内存碎片。
查阅了关于堆栈的一些资料,下面写一下关于堆栈的理解。
先下一个定义:
堆内存是区别于栈,全局数据区和代码区的拎一个内存区域,堆允许程序动态的申请某个大小的内存空间。
做一个比喻:
堆内存就好比自己动手做自己喜欢吃的菜。(必须事事亲力亲为)
栈内存就好比去饭店吃饭只管点菜(发出申请),吃和付账(使用),其他的一些如做菜,吃完后的洗盘子等等都不需要管。好处是方便快捷,但是自由度小。
操作系统中所说的堆内存和栈内存在操作上就具有上述的特点。这里的堆内存和栈内存实际上就是满足堆内存性质的一种数据结构,优先队列,第一个元素具有最高的优先权。栈就是指满足先进后出的数据结构。
一些函数 获取堆内存 malloc() 释放用free() New 和 delete。
我们掌握的堆内存的权柄就是返回的指针,一旦丢掉了指针,使无法在我们的视野内释放它,这边是内存泄露。所以我们使用完了内存空间之后,要记得释放掉。
关于内存泄露,如果不停地申请但是不记得释放,内存就会越来越少,很明显的会使系统变慢或申请不到新的堆内存,过度的申请会使应用程序崩溃。但是关闭程序后操作系统会自动的回收那些内存。
堆内存是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是由链表来存储空闲内存地址的,自然是不连续的,而链表是由低地址向高地址的。堆内存的大小受限于计算机系统中的虚拟内存,由此可见堆内存获取空间比较大和灵活,容易产生内存碎片。
//同类型对象之间直接赋值引发的典型病态程序 #include <iostream> #include <cstring> using namespace std; class Test { char *p; public: Test(char *s=NULL) { if(s) { p=new char[strlen(s)+1]; strcpy(p,s); } else p=NULL; } //程序结束的时候将释放2次堆内存,导致了运行时错误。重载赋值运算符 /* Test& operator=(Test &t) { if(t.p) { char *s = new char[strlen(t.p)+1]; strcpy(s,t.p); delete []p; p=s; } else { delete []p; p=NULL; } return *this; } */ ~Test() { delete[] p; } char* Get(char *a) { if(p) strcpy(a,p); else *a='\0'; return a; } }; int main() { Test s1("江苏"),s2("江风海韵"); char a[100]; cout<<"s1="<<s1.Get(a)<<endl; cout<<"s2="<<s2.Get(a)<<endl; s1=s2; cout<<"s1="<<s1.Get(a)<<endl; cout<<"s2="<<s2.Get(a)<<endl; cin>>a; return 0; }
相关文章推荐
- 【C++】关于堆栈的比较好的理解
- 关于C++ 学习的几点 理解 之 c++关键字详解(volatile,mutable,explicit,dynamic_cast<T>(expression))等
- 我的C++学习日记——关于const数值变量,指针和引用的理解
- 关于学习C/C++的几点理解
- 关于学习C/C++的几点理解
- 个人理解下推荐给菜鸟学习的关于java的基础技术
- 关于SharedPreferences共享参数的学习与理解
- 关于事务日志的再学习理解~!!!!
- 关于C++多态与虚函数的理解
- javaweb学习笔记之关于分层结构的初步理解
- C++学习笔记(六):关于ifdef 和ifndef的使用
- 前端学习(九)关于this关键字的理解
- 关于C++中const的理解
- 关于C++多态的理解
- 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组
- C++ 对象模型学习记录(3)--- 第1章 关于对象(未完)
- 关于C++的学习,对一位网友的回复
- c++ STL学习之stack堆栈总结
- C++学习之深入理解迭代器——迭代器特性、迭代器标志-iterator_traits
- 学习C++动态链接库基础知识 (主要关于QT项目)PART2