c++ delete实现动作
new申请的资源需要delete释放
delete动作:1.清除指向的地址(操作系统标记为可用内存,不一定清除内存中的数值);2.不会将指向该内存的指针设置为nullptr空指针,对应指针会变成悬空指针,直接使用会出现未知行为。
行为 | delete 会做吗? | 说明 |
---|---|---|
清除内存中的数据 | ✅ 是(释放堆内存) | OS 可能标记为“可分配”,但内容未必清零 |
将指针设为 nullptr | ❌ 否 | 指针变量仍然保存原地址,必须手动设置 |
更新其他指针的状态 | ❌ 否 | 不会修改其他指向同一内存的指针 |
取消“指向关系” | ❌ 否 | 指针只是一个变量,delete 不会改动指针本身 |
总结:delete释放资源之后需要将手动将对应指针设置为空指针。
特性 | 空指针 (nullptr ) | 悬空指针 |
---|---|---|
是否指向有效内存? | ❌ 不指向 | ❌ 不再指向有效内存 |
是否可检测? | ✅ 可以用 p == nullptr 判断 | ❌ 表面上看不出问题 |
是否安全? | ✅ 只要不解引用 | ❌ 非常危险 |
是否可以避免? | ✅ 初始化时设为 nullptr | ✅ delete 后设为 nullptr |
解引用后果 | ❌ 崩溃(立即可见) | ❌ 未定义行为(可能延迟爆炸) |