<b>C++:从栈和堆来理解C#中的值范例和引用范例</b>[VC/C++编程]
本文“<b>C++:从栈和堆来理解C#中的值范例和引用范例</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
C++中并没有值范例和引用范例之说,尺度变量大概自定义对象的存取默许是没有辨别的.但假如深化地来看,就要理解C++中,管理数据的两大内存区域:栈和堆.
栈(stack)是近似于一个先进后出的抽屉.它的体积是有限的,普通为2M左右.
而堆(heap)则相对来说体积可以很大,这普通跟计算机的虚拟内存设置有关系.
栈中存取对象的内存是自动回收的,用完即销毁了,普通办法内部的变量和参数都是通过栈来存取的(但也正因为如此,它们的生命周期很短).但它的问题是,体积有限.
一些大的对象,我们大概要通过堆来成立它.程序员可以掌握这些对象什么时刻成立,什么时刻销毁.这无疑带来了机动性,也同时带来了一些风险,事实上,相当一部份的程序的崩溃都是因为不恰本地利用了堆,以及没有及时清理在堆上申请的内存.大概反过来说,大概会清理多次(这也会招致崩溃).
普通来说,假如但愿某个对象大概变量的生命更长一些,也可以将其作为全局变量大概静态变量.但那样又招致了它们必须等到程序完毕才会释放.
下面我用一个例子来演示一下这个问题
#include <iostream>
using namespace std;
class human{
public:
void Talk();
~human(){cout<<"析构函数在工作..."<<endl;}
private:
int age;
};
void human::Talk(){
cout<<"Hello"<<endl;
}
int main()
{
human h;//成立一个human对象,这个对象就生存在栈上,它所需的大小是按照其成员决意的
cout<<"h的大小为:"<<sizeof(h)<<endl;
cout<<"h的地址是:"<<&h<<endl;
h.Talk();
human *p=new human();//通过new关键字,是在堆上面成立一个对象,它所申请的空间也是内部成员决意的.这里也是4
cout<<"p的大小为:"<<sizeof(p)<<endl;
cout<<"p的地址为:"<<p<<endl;
p->Talk();
delete p;
//删除p这个指针指向的堆上面的内存.假如用完该对象,我们不删除,那么该内存就一向存在,并不会自动删除.这就称为内存泄露.
//假如范例定义了析构函数,此时将调用它(反之,假如一个对象是在堆上成立的,那么除非调用delete语句,不然析构函数不会运行
cout<<"p的地址为:"<<p<<endl;//我们只是删除了该块内存上面的数据,地址还是存在的
//倡议在删除p之后,将其置为0
//p=0;
//delete p;//但假如再次删除,又会发生崩溃,因为该内存已经没有了.
return 0;
}
以上是“<b>C++:从栈和堆来理解C#中的值范例和引用范例</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |