C++内存管理与常见内存泄漏解决方案
发布时间: 2024-05-01 17:40:20 阅读量: 102 订阅数: 59
![C++内存管理与常见内存泄漏解决方案](https://img-blog.csdnimg.cn/direct/aa5211e359bd477aad3bd0f62d1ca251.png)
# 2.1 内存分配器和分配策略
### 2.1.1 new和delete操作符
C++ 中最基本的内存分配和释放操作是使用 `new` 和 `delete` 操作符。`new` 操作符用于动态分配内存,并返回指向分配内存块的指针。`delete` 操作符用于释放由 `new` 分配的内存。
```cpp
int* ptr = new int; // 分配一个 int 型变量的内存
delete ptr; // 释放 ptr 指向的内存
```
`new` 操作符接受一个类型参数,指定要分配的内存类型。它还可以接受一个可选的初始化器,用于初始化分配的内存。`delete` 操作符只接受一个指针参数,指定要释放的内存块。
### 2.1.2 内存池和智能指针
**内存池**是一种预先分配内存块的机制,可以减少频繁分配和释放内存的开销。内存池中的内存块可以重复使用,从而提高性能。
**智能指针**是一种封装指针的类,可以自动管理内存。智能指针跟踪指向的内存块,并在不需要时自动释放内存。这有助于防止内存泄漏和悬空指针。
# 2. C++ 内存分配与释放机制
### 2.1 内存分配器和分配策略
#### 2.1.1 new 和 delete 操作符
**new 操作符**
* 用于在堆内存中分配指定大小的内存块。
* 返回指向分配内存块的指针。
* 如果分配失败,抛出 `std::bad_alloc` 异常。
**delete 操作符**
* 用于释放由 `new` 分配的内存块。
* 接受指向要释放内存块的指针。
* 如果指针为 `nullptr`,则不执行任何操作。
**代码示例:**
```cpp
int* ptr = new int; // 分配一个整数
delete ptr; // 释放分配的内存
```
**参数说明:**
* `new` 操作符:分配指定大小的内存块,大小由类型 `T` 决定。
* `delete` 操作符:释放由 `new` 分配的内存块,指针类型为 `T*`。
#### 2.1.2 内存池和智能指针
**内存池**
* 预先分配一组内存块,并按需分配和释放。
* 减少了频繁分配和释放内存的开销。
* 适用于需要频繁分配和释放小内存块的场景。
**智能指针**
* 封装了指向堆内存的指针。
* 自动管理内存的分配和释放。
* 避免了手动管理内存带来的错误。
**代码示例:**
```cpp
std::shared_ptr<int> ptr = std::make_shared<int>(); // 使用智能指针分配内存
ptr.reset(); // 释放智能指针指向的内存
```
**参数说明:**
* `std::make_shared<T>()`:分配一个指向类型 `T` 的智能指针。
* `ptr.reset()`:释放智能指针指向的内存,并使智能指针为 `nullptr`。
### 2.2 内存释放和垃圾回收
#### 2.2.1 析构函数和虚函数表
**析构函数**
* 在对象销毁时自动调用的特殊成员函数。
* 用于释放对象占用的资源,包括堆内存。
**虚函数表**
* 指向对象虚函数的指针表。
* 存储了对象的虚函数地址,用于动态绑定。
* 析构函数的地址也存储在虚函数表中。
**代码示例:**
```cpp
class Base {
public:
virtual ~Base() {} // 虚析构函数
};
class Derived : public Base {
public:
~Derived() override {} // 覆盖析构函数
};
int main() {
Base* base = new Derived();
delete base; // 调用 Derived 的析构函数
return 0;
}
```
**参数说明:**
* `virtual ~Base() {}`:声明基类的虚析构函数。
* `~Derived() override {}`
0
0