English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ Gestión de memoria (new y delete)

En este artículo, aprenderá a usar new y delete para la gestión de memoria en 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;
}

La salida del programa es la misma que la salida del programa anterior.

Al crear el objeto s, se llama al constructor, que asigna memoria para num datos de coma flotante.

El destructor se llama automáticamente cuando el objeto se destruye, es decir, cuando el objeto sale de su alcance.

    ~Test() {
        delete[] ptr;
    }

Este destructor ejecuta delete[] ptr; y devuelve la memoria al sistema operativo.