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