📅  最后修改于: 2020-09-25 04:59:27             🧑  作者: Mango
C++允许我们在运行时分配变量或数组的内存。这称为动态内存分配。
在其他编程语言(例如Java和Python,编译器自动管理分配给变量的内存。但这不是C++中的情况。
在C++中,不需要使用变量后,我们需要手动释放动态分配的内存。
我们可以分别使用new
和delete
运算符动态分配和释放内存。
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;
在这里,我们已经使用指针pointVar
为int
变量动态分配了内存。
打印pointVar
的内容后,我们使用delete
释放内存。
注意 :如果使用new
程序使用了大量不需要的内存,则系统可能会崩溃,因为操作系统没有可用的内存。在这种情况下, delete
运算符可以帮助系统避免崩溃。
#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
在此程序中,我们将内存动态分配给int
和float
类型的两个变量。在为它们分配值并打印它们之后,我们最终使用代码来释放内存
delete pointInt, pointFloat;
注意:动态内存分配可以使内存管理更加有效。
特别是对于数组,在很多情况下,直到运行时我们才知道数组的大小。
// 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变量中。
然后,我们使用new
为float
数组动态分配了内存。
我们使用指针符号将数据输入到数组中(然后打印出来)。
在不再需要数组之后,我们使用代码delete [] ptr;
释放数组内存delete [] ptr;
。
注意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
在此程序中,我们创建了一个具有私有变量age
的Student
类。
我们已经在默认构造函数Student()
中将age
初始化为12
,并使用getAge()
函数打印其值。
在main()
,我们使用new
运算符创建了Student
对象,并使用指针ptr
指向其地址。
创建对象后, Student()
构造函数将age
初始化为12
。
然后,我们使用以下代码调用getAge()
函数 :
ptr->getAge();
注意箭头运算符 ->
。该运算符用于使用指针访问类成员。