动态内存
动态内存是指程序在运行时通过堆(heap)分配的内存,用于在程序执行过程中动态创建和管理数据。在 C++ 中,动态内存使用 new
和 delete
操作符进行分配和释放。
分配单个对象
1 | int* ptr = new int; // 分配一个整数 |
在 C++ 中,还可以使用动态内存分配为类的对象分配内存。通过 new 操作符可以创建对象,同时调用构造函数进行初始化。使用完对象后,需要用 delete 释放内存以调用析构函数并回收资源。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using namespace std;
// 基类
class Animal {
public:
Animal() {
cout << "Animal's constructor called!" << endl;
}
virtual ~Animal() { // 虚析构函数
cout << "Animal's destructor called!" << endl;
}
};
// 派生类
class Dog : public Animal {
public:
Dog() {
cout << "Dog's constructor called!" << endl;
}
~Dog() { // 重载析构函数
cout << "Dog's destructor called!" << endl;
}
};
int main() {
Animal* animal = new Dog(); // 基类指针指向派生类对象
delete animal; // 删除时会调用派生类和基类的析构函数
return 0;
}
/*输出
Animal's constructor called!
Dog's constructor called!
Dog's destructor called!
Animal's destructor called!
*/
分配对象数组
如果需要分配一个类对象的数组,可以使用 new[]
,并在释放时使用 delete[]
。1
2
3
4
5
6
7
8int* arr = new int[5]; // 分配一个包含 5 个整数的数组
for (int i = 0; i < 5; ++i) {
arr[i] = i * 10;
}
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
delete[] arr; // 释放数组内存
注意事项
内存泄漏
忘记调用 delete 或 delete[] 会导致内存泄漏,程序占用的内存无法被操作系统回收。悬空指针
如果在释放内存后继续使用指针,会导致未定义行为。