💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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;`,并将内存返回给操作系统。