动态内存是指程序在运行时通过堆(heap)分配的内存,用于在程序执行过程中动态创建和管理数据。在 C++ 中,动态内存使用 newdelete 操作符进行分配和释放。

分配单个对象

1
2
3
4
int* ptr = new int; // 分配一个整数
*ptr = 42; // 给分配的内存赋值
std::cout << *ptr << std::endl;
delete ptr; // 释放内存

在 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
#include <iostream>
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
8
int* 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[] 会导致内存泄漏,程序占用的内存无法被操作系统回收。

  • 悬空指针
    如果在释放内存后继续使用指针,会导致未定义行为。