编辑这个页面须要登录或更高权限!

C++ 内存管理(new 和 delete)

在本文中,您将学习使用new和delete操作在C ++中有效地管理内存。

数组可用于存储多个同类型数据,但是使用数组存在严重的缺点。

声明数组时应分配内存,但在大多数情况下,直到运行时才能确定所需的确切内存。

在这种情况下,最好的做法是声明一个具有最大可能所需内存的数组(声明一个预期具有最大可能大小的数组)。

不利的一面是未使用的内存被浪费了,不能被任何其他程序使用。

为避免浪费内存,您可以在C ++中使用new和delete运算符动态分配运行时所需的内存。

示例1:C ++内存管理

c++程序存储n个学生的成绩,并将其显示,其中n为用户输入的学生人数。

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int num;
    cout << "输入学生总数: ";
    cin >> num;
    float* ptr;
    
    // 内存分配的浮点数
    ptr = new float[num];

    cout << "输入学生的成绩。" << endl;
    for (int i = 0; i < num; ++i)
    {
        cout << "学生" << i + 1 << ": ";
        cin >> *(ptr + i);
    }

    cout << "\n显示学生的成绩。" << endl;
    for (int i = 0; i < num; ++i) {
        cout << "学生" << i + 1 << " :" << *(ptr + i) << endl;
    }

    // ptr内存被释放
    delete [] ptr;

    return 0;
}

输出结果

输入学生总数: 5
输入学生的成绩。
学生1: 295
学生2: 485
学生3: 650
学生4: 700
学生5: 540

显示学生的成绩。
学生1 :295
学生2 :485
学生3 :650
学生4 :700
学生5 :540

在这个程序中,只动态声明存储num(由用户输入)浮点数所需的内存。

new 运算符

ptr = new float[num];

上面程序中的表达式返回一个指向内存部分的指针,该内存恰好足以容纳num个浮点数据。

delete 运算符

使用new运算符分配内存后,应将其释放回操作系统。

如果程序使用new占用大量内存,则系统可能会崩溃,因为操作系统没有可用的内存,导致内存耗尽。

以下表达式将内存释放返回给操作系统。

delete [] ptr;

方括号[]表示数组已被删除。如果需要删除单个对象,则不需要使用方括号。如:

delete ptr;

示例2:C ++内存管理

C ++中用面向对象的方法来处理的上述程序。

#include <iostream>
using namespace std;

class Test
{
private:
    int num;
    float *ptr;

public:
    Test()
    {
        cout << "输入学生总数: ";
        cin >> num;
        
        ptr = new float[num];
        
        cout << "输入学生的成绩。" << endl;
        for (int i = 0; i < num; ++i)
        {
            cout << "学生" << i + 1 << ": ";
            cin >> *(ptr + i);
        }
    }
    
    ~Test() {
        delete[] ptr;
    }

    void Display() {
        cout << "\n显示学生的成绩。" << endl;
        for (int i = 0; i < num; ++i) {
            cout << "学生" << i+1 << " :" << *(ptr + i) << endl;
        }
    }
    
};
int main() {
    Test s;
    s.Display();
    return 0;
}

该程序的输出与上述程序输出结果相同。

创建对象s时,将调用构造函数,该构造函数为num个浮点数据分配内存。

当对象被销毁时,即,对象超出范围时,将自动调用析构函数。

    ~Test() {
        delete[] ptr;
    }

这个析构函数执行delete[] ptr;并将内存返回给操作系统。