对象销毁
如何手动销毁 指针、变量和类数组?
1. 引用(Reference):无法手动销毁
⚠️ 引用本身无法手动销毁!因为:
- 引用只是别名
- 生命周期跟随被引用对象
- 不能重新绑定到其他对象
2. 指针(Pointer)->delete
2.1 单个对象指针
1 | // 动态分配的单个对象 |
2.2 数组指针
1 | // 动态分配的数组 |
2.3 智能指针(推荐),自动销毁
1 |
|
3. 普通变量!!:无法手动销毁
- 自动变量(栈上)会自动销毁
- 不需要也不能手动销毁
1 | void func() { |
4. 类数组
4.1 栈上的类数组
1 | { |
4.2 堆上的类数组
1 | // 动态分配的类数组 |
5. 实际例子
1 | class Resource { |
⚠️ 注意事项
避免内存泄漏:
1
2
3
4void bad() {
MyClass* p = new MyClass();
// ❌ 忘记delete
} // 内存泄漏!避免重复删除:
1
2
3MyClass* p = new MyClass();
delete p;
delete p; // ❌ 重复删除,未定义行为**数组删除要用 delete[]**:
1
2
3MyClass* arr = new MyClass[5];
delete arr; // ❌ 错误:应该用delete[]
delete[] arr; // ✅ 正确智能指针优先:
1
2
3
4// ✅ 推荐:使用智能指针
std::unique_ptr<MyClass> ptr(new MyClass());
// 或更好
auto ptr = std::make_unique<MyClass>();
💡 最佳实践
优先使用栈对象:
1
2
3void func() {
MyClass obj; // ✅ 自动管理生命周期
}必要时使用智能指针:
1
2auto ptr = std::make_unique<MyClass>();
auto shared = std::make_shared<MyClass>();避免裸指针:
1
2
3
4
5// ❌ 避免
MyClass* ptr = new MyClass();
// ✅ 使用
std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>();资源获取即初始化(RAII):
1
2
3
4
5
6class RAIIWrapper {
Resource* ptr;
public:
RAIIWrapper() : ptr(new Resource()) {}
~RAIIWrapper() { delete ptr; }
};清理后置空:
1
2
3MyClass* ptr = new MyClass();
delete ptr;
ptr = nullptr; // ✅ 好习惯
需要我详细解释任何部分吗?比如 RAII 模式或智能指针的具体使用?
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Min的博客!
评论