文章目录
条款 16:成对使用 new
和 delete
时要采取相同形式
核心思想
-
一致性要求
当使用
new
分配内存时,必须在相应的delete
操作中保持一致:- 如果使用
new
,就用delete
。 - 如果使用
new[]
,就用delete[]
。
- 如果使用
-
问题所在
如果形式不匹配,会导致:
- 未定义行为(例如访问已释放的内存或未正确释放内存)。
- 可能引发资源泄漏。
示例代码
cpp// 正确用法 std::string* stringPtr1 = new std::string; // 单个对象 std::string* stringPtr2 = new std::string[100]; // 数组 delete stringPtr1; // 用 delete 释放单个对象 delete[] stringPtr2; // 用 delete[] 释放数组
错误用法分析
cppstd::string* stringPtr = new std::string[100]; delete stringPtr; // 错误:应该使用 delete[]
- 后果
delete
只会调用数组第一个元素的析构函数,而不会正确释放整个数组的内存。- 导致资源泄漏或其他不可预期的行为。
设计建议
-
明确匹配规则
- 使用
new
创建的对象用delete
释放。 - 使用
new[]
创建的数组用delete[]
释放。
- 使用
-
优先使用智能指针
为避免手动管理动态内存,建议使用标准库提供的智能指针(如
std::unique_ptr
和std::shared_ptr
),它们能自动匹配合适的删除形式。智能指针示例
cpp#include <memory> std::unique_ptr<std::string> stringPtr1(new std::string); // 单个对象 std::unique_ptr<std::string[]> stringPtr2(new std::string[100]); // 数组
-
养成良好习惯
- 避免混用
new
和delete[]
或new[]
和delete
。 - 检查代码以确保成对操作一致性。
- 避免混用
总结
- 使用
new
和delete
的时候,要严格按照成对规则操作。 - 推荐使用智能指针来自动管理动态内存,减少手动内存管理的错误风险。