销毁new的指针

delete 指针实际上释放了指针所指的堆内存,但指针本身是一个32位(在32位机器上)的无符号整数。其值是对象的首地址,这个值并没变。也就是说,你用delete后,不但指针任然存在,而且其内容都没有变换。他本身的释放在超过他生命周期的时候销毁。然而现在指针所指的内存已经不可用了,再次操作其内容将会发生内存错误(比如再次delete)。所以,安全的做法是让指针值等于NULL(如果指针是NULL,delete多少次都可以!)。如果你在释放指针后,又立即分配新的值,那么赋值NULL步骤多余。
### 手动销毁智能指针的方法 在 C++ 中,智能指针的设计初衷是自动管理动态分配的内存资源,避免内存泄漏。然而,在某些情况下,可能需要手动销毁智能指针所管理的资源。以下是针对不同类型的智能指针(`std::shared_ptr` 和 `std::unique_ptr`)的手动销毁方法。 #### 1. 手动销毁 `std::shared_ptr` `std::shared_ptr` 使用引用计数机制来管理资源。当引用计数降为零时,资源会被自动释放。如果需要手动销毁资源,可以通过调用 `reset()` 方法将智能指针重置为 `nullptr`,从而减少引用计数[^1]。 ```cpp #include <memory> #include <iostream> int main() { std::shared_ptr<int> sptr = std::make_shared<int>(10); std::cout << "Before reset: " << sptr.use_count() << std::endl; sptr.reset(); // 手动销毁资源 std::cout << "After reset: " << sptr.use_count() << std::endl; return 0; } ``` 在上述代码中,调用 `sptr.reset()` 将智能指针 `sptr` 的引用计数减少到零,并触发资源的释放操作[^1]。 #### 2. 手动销毁 `std::unique_ptr` `std::unique_ptr` 是独占所有权的智能指针,不允许拷贝。要手动销毁其管理的资源,可以直接调用 `reset()` 方法或让 `unique_ptr` 超出作用域[^3]。 ```cpp #include <memory> #include <iostream> int main() { std::unique_ptr<int> uptr = std::make_unique<int>(10); uptr.reset(); // 手动销毁资源 if (!uptr) { std::cout << "Resource has been released." << std::endl; } return 0; } ``` 通过调用 `uptr.reset()`,可以立即释放 `unique_ptr` 管理的资源,并将指针置为 `nullptr`[^3]。 #### 3. 自定义智能指针销毁 对于自定义智能指针,通常需要显式地实现析构函数以确保资源被正确释放。以下是一个简单的自定义智能指针示例: ```cpp #include <iostream> template <typename T> class MySmartPointer { private: T* ptr_; public: explicit MySmartPointer(T* ptr = nullptr) : ptr_(ptr) {} ~MySmartPointer() { delete ptr_; } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } void reset() { delete ptr_; ptr_ = nullptr; } }; int main() { MySmartPointer<int> ptr(new int(5)); std::cout << *ptr << std::endl; ptr.reset(); // 手动销毁资源 if (ptr.get() == nullptr) { std::cout << "Resource has been released." << std::endl; } return 0; } ``` 在这个例子中,`reset()` 方法被显式调用以释放资源并将其置为 `nullptr`[^3]。 #### 注意事项 - 在使用 `reset()` 方法时,确保没有其他指针或对象依赖于当前智能指针管理的资源。 - 对于 `std::shared_ptr`,如果存在多个指针共享同一资源,则仅当所有指针都调用 `reset()` 或超出作用域时,资源才会被释放。 - 对于 `std::unique_ptr`,由于其独占性,直接调用 `reset()` 即可安全释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值