在本文中,您將學(xué)習(xí)使用new和delete操作在C ++中有效地管理內(nèi)存。
數(shù)組可用于存儲(chǔ)多個(gè)同類(lèi)型數(shù)據(jù),但是使用數(shù)組存在嚴(yán)重的缺點(diǎn)。
聲明數(shù)組時(shí)應(yīng)分配內(nèi)存,但在大多數(shù)情況下,直到運(yùn)行時(shí)才能確定所需的確切內(nèi)存。
在這種情況下,最好的做法是聲明一個(gè)具有最大可能所需內(nèi)存的數(shù)組(聲明一個(gè)預(yù)期具有最大可能大小的數(shù)組)。
不利的一面是未使用的內(nèi)存被浪費(fèi)了,不能被任何其他程序使用。
為避免浪費(fèi)內(nèi)存,您可以在C ++中使用new和delete運(yùn)算符動(dòng)態(tài)分配運(yùn)行時(shí)所需的內(nèi)存。
c++程序存儲(chǔ)n個(gè)學(xué)生的成績(jī),并將其顯示,其中n為用戶輸入的學(xué)生人數(shù)。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int num;
cout << "輸入學(xué)生總數(shù): ";
cin >> num;
float* ptr;
// 內(nèi)存分配的浮點(diǎn)數(shù)
ptr = new float[num];
cout << "輸入學(xué)生的成績(jī)。" << endl;
for (int i = 0; i < num; ++i)
{
cout << "學(xué)生" << i + 1 << ": ";
cin >> *(ptr + i);
}
cout << "\n顯示學(xué)生的成績(jī)。" << endl;
for (int i = 0; i < num; ++i) {
cout << "學(xué)生" << i + 1 << " :" << *(ptr + i) << endl;
}
// ptr內(nèi)存被釋放
delete [] ptr;
return 0;
}輸出結(jié)果
輸入學(xué)生總數(shù): 5 輸入學(xué)生的成績(jī)。 學(xué)生1: 295 學(xué)生2: 485 學(xué)生3: 650 學(xué)生4: 700 學(xué)生5: 540 顯示學(xué)生的成績(jī)。 學(xué)生1 :295 學(xué)生2 :485 學(xué)生3 :650 學(xué)生4 :700 學(xué)生5 :540
在這個(gè)程序中,只動(dòng)態(tài)聲明存儲(chǔ)num(由用戶輸入)浮點(diǎn)數(shù)所需的內(nèi)存。
ptr = new float[num];
上面程序中的表達(dá)式返回一個(gè)指向內(nèi)存部分的指針,該內(nèi)存恰好足以容納num個(gè)浮點(diǎn)數(shù)據(jù)。
使用new運(yùn)算符分配內(nèi)存后,應(yīng)將其釋放回操作系統(tǒng)。
如果程序使用new占用大量?jī)?nèi)存,則系統(tǒng)可能會(huì)崩潰,因?yàn)椴僮飨到y(tǒng)沒(méi)有可用的內(nèi)存,導(dǎo)致內(nèi)存耗盡。
以下表達(dá)式將內(nèi)存釋放返回給操作系統(tǒng)。
delete [] ptr;
方括號(hào)[]表示數(shù)組已被刪除。如果需要?jiǎng)h除單個(gè)對(duì)象,則不需要使用方括號(hào)。如:
delete ptr;
C ++中用面向?qū)ο蟮姆椒▉?lái)處理的上述程序。
#include <iostream>
using namespace std;
class Test
{
private:
int num;
float *ptr;
public:
Test()
{
cout << "輸入學(xué)生總數(shù): ";
cin >> num;
ptr = new float[num];
cout << "輸入學(xué)生的成績(jī)。" << endl;
for (int i = 0; i < num; ++i)
{
cout << "學(xué)生" << i + 1 << ": ";
cin >> *(ptr + i);
}
}
~Test() {
delete[] ptr;
}
void Display() {
cout << "\n顯示學(xué)生的成績(jī)。" << endl;
for (int i = 0; i < num; ++i) {
cout << "學(xué)生" << i+1 << " :" << *(ptr + i) << endl;
}
}
};
int main() {
Test s;
s.Display();
return 0;
}該程序的輸出與上述程序輸出結(jié)果相同。
創(chuàng)建對(duì)象s時(shí),將調(diào)用構(gòu)造函數(shù),該構(gòu)造函數(shù)為num個(gè)浮點(diǎn)數(shù)據(jù)分配內(nèi)存。
當(dāng)對(duì)象被銷(xiāo)毀時(shí),即,對(duì)象超出范圍時(shí),將自動(dòng)調(diào)用析構(gòu)函數(shù)。
~Test() {
delete[] ptr;
}這個(gè)析構(gòu)函數(shù)執(zhí)行delete[] ptr;并將內(nèi)存返回給操作系統(tǒng)。