# C++ 内存管理：`new`和`delete`

> 原文： [https://www.programiz.com/cpp-programming/memory-management](https://www.programiz.com/cpp-programming/memory-management)

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

[数组](/cpp-programming/arrays "C++ Arrays")可用于存储多个同类数据，但是使用数组存在严重缺陷。

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

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

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

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

* * *

## 示例 1：C++ 内存管理

**C++ 程序，用于存储`n`个学生的 GPA，并显示在其中`n`是用户输入的学生人数。**

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

int main()
{
    int num;
    cout << "Enter total number of students: ";
    cin >> num;
    float* ptr;

    // memory allocation of num number of floats
    ptr = new float[num];

    cout << "Enter GPA of students." << endl;
    for (int i = 0; i < num; ++i)
    {
        cout << "Student" << i + 1 << ": ";
        cin >> *(ptr + i);
    }

    cout << "\nDisplaying GPA of students." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "Student" << i + 1 << " :" << *(ptr + i) << endl;
    }

    // ptr memory is released
    delete [] ptr;

    return 0;
} 
```

**输出**

```cpp
Enter total number of students: 4
Enter GPA of students.
Student1: 3.6
Student2: 3.1
Student3: 3.9
Student4: 2.9

Displaying GPA of students.
Student1 :3.6
Student2 :3.1
Student3 :3.9
Student4 :2.9 
```

在此程序中，仅动态声明存储`num`（由用户输入）数量的浮点数据所需的内存。

* * *

## `new`运算符

```cpp
ptr = new float[num];
```

上面程序中的此表达式将[指针](/cpp-programming/pointers "C++ Pointers")返回到刚好足以容纳`num`个浮点数据的内存部分。

* * *

## `delete`运算符

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

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

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

```cpp
delete [] ptr;
```

方括号`[]`表示数组已删除。 如果您需要删除单个对象，则无需使用方括号。

```cpp
delete ptr;
```

* * *

## 示例 2：C++ 内存管理

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

```cpp
#include <iostream>
using namespace std;

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

public:
    Test()
    {
        cout << "Enter total number of students: ";
        cin >> num;

        ptr = new float[num];

        cout << "Enter GPA of students." << endl;
        for (int i = 0; i < num; ++i)
        {
            cout << "Student" << i + 1 << ": ";
            cin >> *(ptr + i);
        }
    }

    ~Test() {
        delete[] ptr;
    }

    void Display() {
        cout << "\nDisplaying GPA of students." << endl;
        for (int i = 0; i < num; ++i) {
            cout << "Student" << i+1 << " :" << *(ptr + i) << endl;
        }
    }

};
int main() {
    Test s;
    s.Display();
    return 0;
} 
```

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

创建对象`Test`时，将调用构造器，该构造器为`num`浮点数据分配内存。

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

```cpp
    ~Test() {
        delete[] ptr;
    }

```

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