C++ 基礎(chǔ)教程

C++ 流程控制

C++ 函數(shù)

C++ 數(shù)組 & 字符串

C++ 數(shù)據(jù)結(jié)構(gòu)

C++ 類 & 對象

C++ 指針

C++ 繼承

C++ STL 教程

C++ 參考手冊

C++ 內(nèi)存管理(new 和 delete)

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

示例1:C ++內(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)存。

new 運(yùn)算符

ptr = new float[num];

上面程序中的表達(dá)式返回一個指向內(nèi)存部分的指針,該內(nèi)存恰好足以容納num個浮點(diǎn)數(shù)據(jù)。

delete 運(yùn)算符

使用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;

示例2:C ++內(nèi)存管理

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)。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清