C++手撕unique_ptr
时间: 2023-09-19 21:10:48 浏览: 50
unique_ptr 是 C++11 标准提供的智能指针,用于管理动态分配的对象。它使用了独占所有权的概念,保证了在不再需要指针时自动释放资源,从而避免了内存泄漏。
手撕 unique_ptr 的实现涉及到指针的拷贝和移动语义。下面是一个简单的手撕 unique_ptr 的示例代码:
```cpp
template <typename T>
class unique_ptr {
public:
explicit unique_ptr(T* ptr = nullptr) : ptr_(ptr) {}
~unique_ptr() {
delete ptr_;
}
unique_ptr(const unique_ptr&) = delete; // 禁用拷贝构造函数
unique_ptr& operator=(const unique_ptr&) = delete; // 禁用拷贝赋值运算符
unique_ptr(unique_ptr&& other) noexcept : ptr_(other.ptr_) {
other.ptr_ = nullptr;
}
unique_ptr& operator=(unique_ptr&& other) noexcept {
if (this != &other) {
delete ptr_;
ptr_ = other.ptr_;
other.ptr_ = nullptr;
}
return *this;
}
T& operator*() const {
return *ptr_;
}
T* operator->() const {
return ptr_;
}
T* get() const {
return ptr_;
}
private:
T* ptr_;
};
```
上述代码中,我们定义了一个类模板 `unique_ptr`,它模拟了标准库中的 `std::unique_ptr` 功能。在构造函数中,我们接受一个指针作为参数,并将其保存在 `ptr_` 成员变量中。析构函数负责释放指针所指向的资源。为了遵循独占所有权的原则,我们禁用了拷贝构造函数和拷贝赋值运算符,而使用移动语义来实现赋值操作。`operator*` 和 `operator->` 用于重载解引用操作符,方便使用指针指向的对象。
需要注意的是,上述实现只是一个简单的手撕版 unique_ptr,并没有处理更复杂的边界情况和异常安全性。在实际使用中,建议使用标准库提供的 `std::unique_ptr`,它已经经过了充分测试和优化。