4-數組、指標與字串1.4-動態記憶體分配

來源:互聯網
上載者:User

標籤:lib   mem   類的建構函式   pac   多維陣列   poi   自動調用   gety   字元   

這種在程式運行過程中申請和釋放的儲存單元也稱為堆對象,申請和釋放過程過程一般稱為建立和刪除。

1、new運算和delete運算

運算子new的功能是動態分配記憶體,或者稱為動態建立堆對象,文法形式為:

new 類型名T(初值列表);//用於申請分配存放T類型資料的記憶體空間,並使用初值列表中給出的值進行初始化。

如果建立的對象是一個基本類型變數,初始化過程就是賦值,如:

int *point;

point =new int(2);

動態分配了用於存放int類型資料的記憶體空間,並將初值2存入該空間中,然後將首地址賦給指標point。

如果建立的對象時某一個類的執行個體對象,就是要根據實際情況調用該類的建構函式。

運算子delete用來刪除由new建立的對象,釋放指標所指向的記憶體空間。格式為:

delete 指標名;

如果刪除的是對象,該對象的解構函式將被調用。對於用new建立的對象,只能使用delete進行一次刪除操作,如果對同一記憶體空間多次使用delete進行刪除將會導致運行錯誤。

#include<iostream>
using namespace std;
class Point
{
public:
Point()
{X=Y=0;cout<<"Default Constructor called."<<endl;}
Point(int xx,int yy){X=xx;Y=yy;cout<<"Constructor called."<<endl;}//建構函式
~Point()
{cout<<"Destructor called."<<endl;}
int GetX(){return X;}
int GetY(){return Y;}
void Move(int x,int y)
{X=x;Y=y;}

private:
int X,Y;
};

int main()
{
cout<<"Step One:"<<endl;
Point *Ptrl=new Point;//動態建立對象,沒有給出初值,因此調用預設的建構函式
delete Ptrl;//刪除對象,自動調用解構函式
cout<<"Step Two:"<<endl;
Ptrl=new Point(1,2);//動態建立對象,並給出初值,因此調用有形參的建構函式
delete Ptrl;//刪除對象,自動調用解構函式
getchar();
}

使用運算子new也可以建立數群組類型的對象,這時,需要給出數組的結構說明,用new運算子動態建立一維數組的文法形式為:

new 類型名T{下標運算式}

其中下標運算式之處數組元素的個數,動態為數組分配記憶體時不能指定數組元素的初值。注意,如果是用new建立的數組,用delete刪除時在指標名前面要加"[]",如

#include<iostream>

using namespace std;

class Point

{

  //類的定義

};

int main()

{

  Point *Ptr=new Point[2];//建立對象數組

  Ptr[0].Move(5,10);//通過指標訪問數組元素的成員

  Ptr[1].Move(15,20);//通過指標訪問數組元素的成員

  cout<<"Deleting ..."<<endl;

  delete[] Ptr;//刪除整個對象數組

}

利用動態記憶體分配操作實現了數組的動態建立,使得數組元素的個數可以根據運行時的需要而確定。但是建立和刪除數組的過程使得程式略顯繁瑣,更好的方法是將數組的建立和刪除過程封裝起來,形成一個動態數組類。

eg:

#include<iostream>

using namespace std;

class Point

{

  //類的定義

};

class ArrayOfPoints

{

  public:

  ArrayOfPoints(int n)

  {numberOfPoints=n;points=new Point[n];}

  ~ArrayOfPoints()

  {cout<<"Deleting..."<<endl;numberOfPoints=0;delete[] points;}

  Point& Element(int n)

  {return points[n];}

  private:

  Point *points;

  int numberOfPoints;

};

int main()

{

  int numbers;

  cout<<"Please enter the number of points:";

  cin>>number;

  ArrayOfPoints points(number);//建立對象數組

  points.Element(0).Move(5,10);//通過指標訪問數組元素的成員

  points.Element(1).Move(15,20);//同上

}

在main函數中,只是建立一個ArrayOfPoints類的對象,對象的初始化參數number指定了數組元素的個數,建立和刪除對象數組的過程都由ArrayOfPoints類的建構函式和解構函式完成。

用new操作也可以建立多維陣列,形式如下:

new 類型名T[下標運算式1][下標運算式2]...;

eg:float *fp;

fp=new float[10][25][10];

會產生錯誤,因為這裡new操作產生的是指向一個25x10的二維float類型數組的指標。應該改為:

float (*cp)[25][10];

cp =new float[10][25][10];

2、動態記憶體分配與釋放函數

a、動態儲存裝置分配函數

原型:void *malloc(size);

參數:size是欲分配的位元組數

傳回值:成功,則返回void型智者;失敗,則返回null 指標。

標頭檔:<stdlib.h>和<malloc.h>

b、動態記憶體釋放函數

原型:void free(void *memblock);

參數:memblock是指標,指向需要釋放的記憶體。

傳回值:無

標頭檔:<stdlib.h>和<malloc.h>

 

4-數組、指標與字串1.4-動態記憶體分配

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.