推荐答案
测试一下
题目
4.2 delete函数 ................................ ................................ ................................ .......…
参考答案与知识点
参考答案
在C++中,`delete` 函数用于释放由 `new` 动态分配的单个对象的内存,并调用该对象的析构函数。核心考点包括:
1. **`delete` 与 `delete[]` 的区别**:`delete` 释放单个对象,`delete[]` 释放对象数组。若误用(如用 `delete` 释放 `new[]` 分配的内存),会导致未定义行为,通常表现为内存泄漏或程序崩溃。
2. **析构函数的调用**:`delete` 操作会先调用对象的析构函数,再释放内存。若指针为 `nullptr`,则 `delete` 是安全的,不执行任何操作。
3. **双重释放(Double Free)**:对同一指针多次调用 `delete` 会导致未定义行为。通常需在 `delete` 后将指针置为 `nullptr` 以避免。
4. **内存泄漏**:忘记 `delete` 动态分配的内存会导致资源无法回收,尤其在长期运行的程序中危害严重。使用智能指针(如 `std::unique_ptr`、`std::shared_ptr`)可自动管理生命周期。
5. **自由存储区与堆的差异**:虽然大多数实现中自由存储区就是堆,但标准并未强制规定,`new`/`delete` 的实现可能使用不同的内存池,因此不应混用 `malloc`/`free` 与 `new`/`delete`。
易错点:
- 混淆 `delete` 和 `delete[]`,造成内存损坏。
- 在构造函数中 `new` 内存,但析构函数中未对应 `delete`。
- 在 `delete` 后未置空指针,导致后续误用悬空指针。
- 在异常处理中未释放内存,应使用 RAII 机制。
涉及知识点
- delete与delete[]的区别
- 析构函数的调用时机
- 双重释放与悬空指针
- 内存泄漏及预防
- 自由存储区与堆的关系