您的位置:首页 > 编程语言 > C语言/C++

c++学习之--关于堆栈理解

2013-11-17 15:09 411 查看
运算符重载7~重载赋值运算符.cpp这个代码涉及到释放2次堆内存导致运行错误。

查阅了关于堆栈的一些资料,下面写一下关于堆栈的理解。

先下一个定义:

堆内存是区别于栈,全局数据区和代码区的拎一个内存区域,堆允许程序动态的申请某个大小的内存空间。

做一个比喻:

堆内存就好比自己动手做自己喜欢吃的菜。(必须事事亲力亲为)

栈内存就好比去饭店吃饭只管点菜(发出申请),吃和付账(使用),其他的一些如做菜,吃完后的洗盘子等等都不需要管。好处是方便快捷,但是自由度小。

操作系统中所说的堆内存和栈内存在操作上就具有上述的特点。这里的堆内存和栈内存实际上就是满足堆内存性质的一种数据结构,优先队列,第一个元素具有最高的优先权。栈就是指满足先进后出的数据结构。

一些函数 获取堆内存 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: