2.1面向对象程序设计基础(2)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章