📜  C++内存管理:新增和删除

📅  最后修改于: 2020-09-25 04:59:27             🧑  作者: Mango

在本教程中,我们将在示例的帮助下学习使用new和delete操作在C++中有效地管理内存。

C++允许我们在运行时分配变量或数组的内存。这称为动态内存分配。

在其他编程语言(例如Java和Python,编译器自动管理分配给变量的内存。但这不是C++中的情况。

在C++中,不需要使用变量后,我们需要手动释放动态分配的内存。

我们可以分别使用newdelete 运算符动态分配和释放内存。

C++新运算符

new 运算符将内存分配给变量。例如,

// declare an int pointer
int* pointVar;

// dynamically allocate memory
// using the new keyword 
pointVar = new int;

// assign value to allocated memory
*pointVar = 45;

在这里,我们使用new 运算符为int变量动态分配了内存。

注意,我们已经使用指针pointVar来动态分配内存。这是因为new 运算符返回了存储位置的地址。

对于数组, new 运算符将返回数组第一个元素的地址。

从上面的示例中,我们可以看到使用new 运算符的语法是

pointerVariable = new dataType;

删除运算符

一旦不再需要使用动态声明的变量,就可以释放该变量占用的内存。

为此,使用了delete 运算符 。它将内存返回给操作系统。这称为内存释放

该运算符的语法是

delete pointerVariable;

考虑以下代码:

// declare an int pointer
int* pointVar;

// dynamically allocate memory
// for an int variable 
pointVar = new int;

// assign value to the variable memory
*pointVar = 45;

// print the value stored in memory
cout << *pointVar; // Output: 45

// deallocate the memory
delete pointVar;

在这里,我们已经使用指针pointVarint变量动态分配了内存。

打印pointVar的内容后,我们使用delete释放内存。

注意 :如果使用new程序使用了大量不需要的内存,则系统可能会崩溃,因为操作系统没有可用的内存。在这种情况下, delete 运算符可以帮助系统避免崩溃。

示例1:C++动态内存分配

#include 
using namespace std;

int main() {
    // declare an int pointer
    int* pointInt;

    // declare a float pointer
    float* pointFloat;

    // dynamically allocate memory
    pointInt = new int;
    pointFloat = new float;

    // assigning value to the memory
    *pointInt = 45;
    *pointFloat = 45.45f;

    cout << *pointInt << endl;
    cout << *pointFloat << endl;

    // deallocate the memory
    delete pointInt, pointFloat;

    return 0;
}

输出

45
45.45

在此程序中,我们将内存动态分配给intfloat类型的两个变量。在为它们分配值并打印它们之后,我们最终使用代码来释放内存

delete pointInt, pointFloat;

注意:动态内存分配可以使内存管理更加有效。

特别是对于数组,在很多情况下,直到运行时我们才知道数组的大小。

示例2:C++数组的new和delete运算符

// C++ Program to store GPA of n number of students and display it
// where n is the number of students entered by the user

#include 
#include 
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;
}

输出

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变量中。

然后,我们使用newfloat数组动态分配了内存。

我们使用指针符号将数据输入到数组中(然后打印出来)。

在不再需要数组之后,我们使用代码delete [] ptr;释放数组内存delete [] ptr;

注意delete之后使用[] 。我们使用方括号[]来表示内存释放是数组的释放。

示例3:C++对象的new和delete运算符

#include 
using namespace std;

class Student {
    int age;

   public:

    // constructor initializes age to 12
    Student() : age(12) {}

    void getAge() {
        cout << "Age = " << age << endl;
    }
};

int main() {

    // dynamically declare Student object
    Student* ptr = new Student();

    // call getAge() function
    ptr->getAge();

    // ptr memory is released
    delete ptr;

    return 0;
}

输出

Age = 12

在此程序中,我们创建了一个具有私有变量ageStudent类。

我们已经在默认构造函数Student()中将age初始化为12 ,并使用getAge() 函数打印其值。

main() ,我们使用new 运算符创建了Student对象,并使用指针ptr指向其地址。

创建对象后, Student()构造函数将age初始化为12

然后,我们使用以下代码调用getAge() 函数 :

ptr->getAge();

注意箭头运算符 -> 。该运算符用于使用指针访问类成员。