在本文中,您将学习使用new和delete操作在C ++中有效地管理内存。
数组可用于存储多个同类型数据,但是使用数组存在严重的缺点。声明数组时应分配内存,但在大多数情况下,直到运行时才能确定所需的确切内存。在这种情况下,最好的做法是声明一个具有最大可能所需内存的数组(声明一个预期具有最大可能大小的数组)。不利的一面是未使用的内存被浪费了,不能被任何其他程序使用。为避免浪费内存,您可以在C ++中使用new和delete运算符动态分配运行时所需的内存。
c++程序存储n个学生的成绩,并将其显示,其中n为用户输入的学生人数
- #include
- int main() {
- int num;
- std::cout << "输入学生总数:";
- std::cin >> num;
- float* ptr;
-
- // 内存分配的浮点数
- ptr = new float[num];
- std::cout << "输入学生成绩:" << std::endl;
- for (int i = 0; i < num; i++) {
- std::cout << "学生" << i + 1 << ":";
- std::cin >> *(ptr + i);
- }
-
- std::cout << "显示学生的成绩:" << std::endl;
- for (int i = 0; i < num; i++) {
- std::cout << "学生" << i + 1 << ":" << *(ptr + i) << std::endl;
-
- }
-
- // ptr 内存释放
- delete[]ptr;
- return 0;
- }
输出结果:
在这个程序中,只动态声明存储num(由用户输入)浮点数所需的内存。
ptr = new float[num];
上面程序中的表达式返回一个指向内存部分的指针,该内存恰好足以容纳num个浮点数据。
使用new运算符分配内存后,应将其释放回操作系统。如果程序使用new占用大量内存,则系统可能会崩溃,因为操作系统没有可用的内存,导致内存耗尽。以下表达式将内存释放返回给操作系统。
delete [] ptr;
方括号[]表示数组已被删除。如果需要删除单个对象,则不需要使用方括号。如:
delete ptr;
C ++中用面向对象的方法来处理的上述程序。
- #include
- class Test {
- private:
- int num; // 学生个数
- float* ptr;
-
- public:
- Test() { // 构造函数
- std::cout << "输入学生总数:";
- std::cin >> num;
-
- ptr = new float[num];
-
- std::cout << "输入学生成绩:" << std::endl;
- for (int i = 0; i < num; i++) {
- std::cout << "学生" << i + 1 << ":";
- std::cin >> *(ptr + i);
- }
- }
-
- ~Test() {
- delete[]ptr;
-
- }
- void display() {
- std::cout << "显示学生成绩:" << std::endl;
- for (int i = 0; i < num; i++) {
- std::cout << "学生" << i + 1 << ":" << *(ptr + i) << std::endl;
- }
- }
- };
-
- int main() {
- Test s;
- s.display();
- return 0;
- }
该程序的输出与上述程序输出结果相同。创建对象s时,将调用构造函数,该构造函数为num个浮点数据分配内存。当对象被销毁时,即,对象超出范围时,将自动调用析构函数。
~Test() { delete[] ptr; }
这个析构函数执行delete[] ptr;并将内存返回给操作系统。