智能指针赋值运算符重载
时间: 2023-07-20 19:11:12 浏览: 102
智能指针赋值运算符重载的实现主要涉及到两个方面:浅拷贝和深拷贝。
对于浅拷贝,如果两个智能指针指向同一个对象,那么在进行赋值操作时,会导致两个智能指针指向同一个对象,当其中一个指针释放了对象之后,另一个指针就变成了空悬指针,这就会导致程序崩溃。因此,在智能指针的赋值运算符重载中,需要进行判断,如果两个智能指针指向同一个对象,就不进行赋值操作。
对于深拷贝,需要在赋值操作时,将原来的指针指向的对象释放,并将新的指针指向一个新的对象。具体实现时,可以使用引用计数的方式,记录当前有多少个智能指针指向同一个对象,在赋值时,只有当当前智能指针是指向该对象的最后一个指针时,才进行对象的释放和重新分配。
下面是一个智能指针赋值运算符重载的示例代码:
```c++
template <typename T>
class SmartPtr {
public:
SmartPtr(T* ptr = nullptr) : ptr_(ptr), count_(new size_t(1)) {}
SmartPtr(const SmartPtr& other) : ptr_(other.ptr_), count_(other.count_) {
++(*count_);
}
SmartPtr& operator=(const SmartPtr& other) {
if (this != &other) {
if (--(*count_) == 0) {
delete ptr_;
delete count_;
}
ptr_ = other.ptr_;
count_ = other.count_;
++(*count_);
}
return *this;
}
~SmartPtr() {
if (--(*count_) == 0) {
delete ptr_;
delete count_;
}
}
private:
T* ptr_;
size_t* count_;
};
```
阅读全文