4-数组、指针与字符串1.4-动态内存分配
這種在程序運行過程中申請和釋放的存儲單元也稱為堆對象,申請和釋放過程過程一般稱為建立和刪除。
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型智者;失敗,則返回空指針。
頭文件:<stdlib.h>和<malloc.h>
b、動態內存釋放函數
原型:void free(void *memblock);
參數:memblock是指針,指向需要釋放的內存。
返回值:無
頭文件:<stdlib.h>和<malloc.h>
?
轉載于:https://www.cnblogs.com/gary-guo/p/6230032.html
總結
以上是生活随笔為你收集整理的4-数组、指针与字符串1.4-动态内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度陆奇最新内部演讲:如何成为一个优秀的
- 下一篇: Docker(4)-容器互联与端口映射