2.1.3对象的动态建立与释放
全局数据区:全局变量、静态数据、常量
代码区:类成员函数、非成员函数代码
栈区:局部变量、函数参数、返回数据、返回地址
堆区:动态存储分配,建立后一定要释放(否侧会出现内存泄漏)
建立对象格式:
CRectangle *pRect=new CRectangle;
或者:
CRectangle *pRect=new CRectangle(40,10);
——->类名 *指针变量名= new 类名;
注:new 返回指针
释放对象格式:
delete pRect;
——->delete 指针名字
1.一维对象数组动态内存的分配与释放
建立:
CRectangle *pRect=new CRectangle[2];
释放:
delete[] pRect;
2.二维对象数组动态内存的分配与释放
建立:
类名 **指针变量名 = new 类名 *[行下标表达式(可以非常量)]
for(int i=0;i<行向量表达式;i++)
{
指针变量名[i]=new 类名 [列下标表达式];//相当于一个一维数组
}
//先按行创建,后按列创建
释放:
for(int i=0;i<行下标表达式;i++)
{
delete[]指针变量名[i];
}
delete[]指针变量名;
//先按列释放,后按行释放
注意:由堆创建的对象数组,只能调用默认的构造函数。如果没有默认构造函数,不能创建对象数组。
实例:
#include <iostream>
using namespace std;
class CBucket//定义桶类
{
public:
int ScanLine;//申明扫描线位置
CBucket *pNext;//申明下一桶节点的指针
};
int main ()
{
CBucket *pHead=new CBucket,*pCurrentB;//定义桶节点的头指针和当前指针
pCurrentB=pHead;
pCurrentB->ScanLine=1;//第一个扫描线为1
cout<<"第一个节点的扫描线位置是:"
<<pCurrentB->ScanLine<<endl;
pCurrentB->pNext=new CBucket;//为当前指针的pNext指针新建节点
pCurrentB=pCurrentB->pNext;//当前指针后移
pCurrentB->ScanLine=2;
cout<<"第二个节点的扫描线位置是:"
<<pCurrentB->ScanLine<<endl;
pCurrentB->pNext=NULL;//只构造两个节点
delete pHead;
delete pCurrentB;//当前的指针指向的内存也是由new生成的,也要delete
pHead=NULL;
pCurrentB=NULL;//这两个指针没有撤销,不要让他们乱指
return 1;
}