日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4-数组、指针与字符串1.4-动态内存分配

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-动态内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。