蓝色车身配白色轮毂:利用栈和堆来定义对象的不同之处~~
来源:百度文库 编辑:中财网 时间:2024/05/05 06:22:07
我们在定义一个类的对象的时候,通常有两种方法:
- 采用栈来定义对象:Human unique;
- 采用堆来定义对象:Human *unique=new Human;
下面,我们通过一个程序来说明这两种方法的区别:
View Code#include
using
namespace
std;
class
Human
{
public
:
Human();
~Human();
int
get()
const
{
return
*i;}
void
set(
int
x){*i=x;}
private
:
int
*i;
};
int
main()
{
cout<<
"利用堆来定义对象:\n"
;
Human *tom=
new
Human;
cout<get()<
tom->set(0);
cout<get()<
cout<
cout<<
"利用栈来定义对象:\n"
;
Human unique;
cout<
unique.set(0);
cout<
return
0;
}
Human::Human()
{
cout<<
"构造函数执行中...\n"
;
i=
new
int
(10);
}
Human::~Human()
{
cout<<
"析构函数执行中...\n"
;
delete
i;
}
该程序输出结果为:
对该结果的分析:
我们在程序的第16行和第24行分别采用了堆分配(new Human)和栈分配(Human unqiue)的方式来创建了两个对象。我们从输出可以清楚的看出来,只有在利用栈分配对象的时候,编译器在最后才会自动调用该类的析构函数来销毁这个对象;而对于利用堆分配的方式,编译器是不会自动释放其所占的内存的。只有通过程序员自己在最后调用delete来释放该内存区域。即,如果我们在上面程序的第20行上面加上
delete
tom;
那么编译器才会调用析构函数来释放对象tom所占用的内存空间。结果如下图所示:
综上所述:
- 如果我们采用栈来定义对象。那么该对象会由系统自动为其在栈中间开辟空间,然后在释放对象的时候,比如说运行到右大括号的时候,系统也会自动的调用析构函数释放该对象所占用的内存空间。
- 如果我们采用堆来定义对象。即利用new的方式来分配空间给需要的对象,那么我们就必须要自行释放其所占用的内存,否则该对象所占用的内存会在整个程序全部结束的时候才会被操作系统回收。
机制和体制的定义,它们的相同和不同之处
JAVA中类和对象的定义
赤潮的定义,类型,利用产生原因,防治和利用
栈和堆的大小限制
北美全明星篮球赛的定义和参赛对象指哪些?
堆和堆栈的区别
堆和栈是什么啊
ASP和DHTML的不同之处!!
爬山虎和爬墙虎的不同之处
能不能介绍一下堆和栈的有关知识啊
公安局和派出所的不同之处在哪里,这两个名词是怎么来的?谢谢!
什么是”定义良好的”,”容器对象”?
世界经济学的定义,范围,对象
c++中定义一个对象时,子类和基类的构造顺序???
压水堆和高温气冷堆的区别
堆和栈有什么区别
威尼斯和苏州的相同与不同之处
谁知道北航和其他大学的不同之处?
请问手机和小灵通的不同之处?
可比性和一贯性原则的不同之处?
手办和扭蛋的不同之处
秦朝和隋朝的相同与不同之处
photoshop和3Dmax的不同之处是什么?
硬盘和U盘的不同之处