4-数组、指针与字符串1.4-动态内存分配
這種在程序運行過程中申請和釋放的存儲單元也稱為堆對象,申請和釋放過程過程一般稱為建立和刪除。
1、new運算和delete運算
運算符new的功能是動態(tài)分配內(nèi)存,或者稱為動態(tài)創(chuàng)建堆對象,語法形式為:
new 類型名T(初值列表);//用于申請分配存放T類型數(shù)據(jù)的內(nèi)存空間,并使用初值列表中給出的值進(jìn)行初始化。
如果建立的對象是一個基本類型變量,初始化過程就是賦值,如:
int *point;
point =new int(2);
動態(tài)分配了用于存放int類型數(shù)據(jù)的內(nèi)存空間,并將初值2存入該空間中,然后將首地址賦給指針point。
如果建立的對象時某一個類的實例對象,就是要根據(jù)實際情況調(diào)用該類的構(gòu)造函數(shù)。
運算符delete用來刪除由new建立的對象,釋放指針?biāo)赶虻膬?nèi)存空間。格式為:
delete 指針名;
如果刪除的是對象,該對象的析構(gòu)函數(shù)將被調(diào)用。對于用new建立的對象,只能使用delete進(jìn)行一次刪除操作,如果對同一內(nèi)存空間多次使用delete進(jìn)行刪除將會導(dǎo)致運行錯誤。
#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;}//構(gòu)造函數(shù)
~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;//動態(tài)創(chuàng)建對象,沒有給出初值,因此調(diào)用默認(rèn)的構(gòu)造函數(shù)
delete Ptrl;//刪除對象,自動調(diào)用析構(gòu)函數(shù)
cout<<"Step Two:"<<endl;
Ptrl=new Point(1,2);//動態(tài)創(chuàng)建對象,并給出初值,因此調(diào)用有形參的構(gòu)造函數(shù)
delete Ptrl;//刪除對象,自動調(diào)用析構(gòu)函數(shù)
getchar();
}
使用運算符new也可以創(chuàng)建數(shù)組類型的對象,這時,需要給出數(shù)組的結(jié)構(gòu)說明,用new運算符動態(tài)創(chuàng)建一維數(shù)組的語法形式為:
new 類型名T{下標(biāo)表達(dá)式}
其中下標(biāo)表達(dá)式之處數(shù)組元素的個數(shù),動態(tài)為數(shù)組分配內(nèi)存時不能指定數(shù)組元素的初值。注意,如果是用new建立的數(shù)組,用delete刪除時在指針名前面要加"[]",如
#include<iostream>
using namespace std;
class Point
{
//類的定義
};
int main()
{
Point *Ptr=new Point[2];//創(chuàng)建對象數(shù)組
Ptr[0].Move(5,10);//通過指針訪問數(shù)組元素的成員
Ptr[1].Move(15,20);//通過指針訪問數(shù)組元素的成員
cout<<"Deleting ..."<<endl;
delete[] Ptr;//刪除整個對象數(shù)組
}
利用動態(tài)內(nèi)存分配操作實現(xiàn)了數(shù)組的動態(tài)創(chuàng)建,使得數(shù)組元素的個數(shù)可以根據(jù)運行時的需要而確定。但是建立和刪除數(shù)組的過程使得程序略顯繁瑣,更好的方法是將數(shù)組的建立和刪除過程封裝起來,形成一個動態(tài)數(shù)組類。
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);//創(chuàng)建對象數(shù)組
points.Element(0).Move(5,10);//通過指針訪問數(shù)組元素的成員
points.Element(1).Move(15,20);//同上
}
在main函數(shù)中,只是建立一個ArrayOfPoints類的對象,對象的初始化參數(shù)number指定了數(shù)組元素的個數(shù),創(chuàng)建和刪除對象數(shù)組的過程都由ArrayOfPoints類的構(gòu)造函數(shù)和析構(gòu)函數(shù)完成。
用new操作也可以創(chuàng)建多維數(shù)組,形式如下:
new 類型名T[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]...;
eg:float *fp;
fp=new float[10][25][10];
會產(chǎn)生錯誤,因為這里new操作產(chǎn)生的是指向一個25x10的二維float類型數(shù)組的指針。應(yīng)該改為:
float (*cp)[25][10];
cp =new float[10][25][10];
2、動態(tài)內(nèi)存分配與釋放函數(shù)
a、動態(tài)存儲分配函數(shù)
原型:void *malloc(size);
參數(shù):size是欲分配的字節(jié)數(shù)
返回值:成功,則返回void型智者;失敗,則返回空指針。
頭文件:<stdlib.h>和<malloc.h>
b、動態(tài)內(nèi)存釋放函數(shù)
原型:void free(void *memblock);
參數(shù):memblock是指針,指向需要釋放的內(nèi)存。
返回值:無
頭文件:<stdlib.h>和<malloc.h>
?
轉(zhuǎn)載于:https://www.cnblogs.com/gary-guo/p/6230032.html
總結(jié)
以上是生活随笔為你收集整理的4-数组、指针与字符串1.4-动态内存分配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度陆奇最新内部演讲:如何成为一个优秀的
- 下一篇: Docker(4)-容器互联与端口映射