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;
}