在本文中,您將學(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)。