C++智能指针的模拟实现实例
简介
在C++中,有一种叫做智能指针的类型,它的作用是自动管理指针资源,避免内存泄漏等问题。C++智能指针是C++11标准引入的一个新特性,包括了unique_ptr、shared_ptr、weak_ptr三种智能指针。本文将介绍C++智能指针的模拟实现方式,让各位读者了解智能指针的本质和实现方式,从而更好地应用智能指针。
unique_ptr
unique_ptr是独占式智能指针,它拥有对指针资源的独占使用权,当unique_ptr被销毁时,它所管理的指针资源也将被销毁。通常情况下,我们会通过new操作符来构造unique_ptr。
template<class T>
class unique_ptr {
private:
T* m_ptr;
public:
unique_ptr() : m_ptr(nullptr) {}
explicit unique_ptr(T* ptr) : m_ptr(ptr) {}
~unique_ptr() { delete m_ptr; }
// 禁止复制和赋值
unique_ptr(const unique_ptr& ptr) = delete;
unique_ptr& operator=(const unique_ptr& ptr) = delete;
T* operator->() const {
return m_ptr;
}
T& operator*() const {
return *m_ptr;
}
};
在这个示例中,我们定义了一个unique_ptr的实现,其中m_ptr是指向所管理对象的指针。unique_ptr的析构函数会在unique_ptr对象被销毁时释放它所管理的内存资源。此外,unique_ptr的拷贝构造函数和赋值函数被禁用,这意味着unique_ptr不能被复制或赋值,从而保证了资源的独占性。最后,我们重载了 -> 和 * 运算符,以方便访问所管理的对象。
下面是一个使用unique_ptr的示例:
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> ptr(new int(42));
std::cout << *ptr << std::endl; // 输出 42
return 0;
}
在这个示例中,我们先定义了一个unique_ptr对象ptr,然后通过new操作符分配了一个int类型的内存资源,并将其传给ptr。最后,我们通过*号操作符访问ptr所管理的对象并输出其值。
shared_ptr
shared_ptr是共享式智能指针,它可以被多个shared_ptr对象共享,当最后一个shared_ptr对象被销毁时,它所管理的指针资源也将被销毁。与unique_ptr不同,我们可以通过make_shared函数来构造shared_ptr。
template<class T>
class shared_ptr {
private:
T* m_ptr;
int* m_use_count;
void add_ref() {
if(m_use_count) {
++(*m_use_count);
}
}
void release() {
if(m_use_count) {
--(*m_use_count);
if(*m_use_count == 0) {
delete m_ptr;
delete m_use_count;
}
}
}
public:
shared_ptr() : m_ptr(nullptr), m_use_count(nullptr) {}
explicit shared_ptr(T* ptr) : m_ptr(ptr), m_use_count(new int(1)) {}
~shared_ptr() { release(); }
shared_ptr(const shared_ptr& ptr) : m_ptr(ptr.m_ptr), m_use_count(ptr.m_use_count) {
add_ref();
}
shared_ptr& operator=(const shared_ptr& ptr) {
release();
m_ptr = ptr.m_ptr;
m_use_count = ptr.m_use_count;
add_ref();
return *this;
}
T* operator->() const {
return m_ptr;
}
T& operator*() const {
return *m_ptr;
}
};
在这个实现中,我们定义了m_use_count指向一个引用计数对象,记录共享该资源的shared_ptr对象数量。当构造一个shared_ptr对象时,我们给m_use_count赋初值1,并在拷贝构造和赋值函数中对引用计数对象进行递增和递减操作。当引用计数对象的值变为0时,我们销毁所管理的资源和引用计数对象。最后,我们定义了与unique_ptr相同的重载运算符。
下面是一个使用shared_ptr的示例:
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> ptr1 = std::make_shared<int>(42);
std::shared_ptr<int> ptr2 = ptr1;
std::cout << *ptr1 << ", " << *ptr2 << std::endl; // 输出 42, 42
return 0;
}
在这个示例中,我们定义了两个shared_ptr对象ptr1和ptr2,ptr1构造时通过make_shared函数分配了一个int类型的内存资源,并将其传给ptr1。然后我们通过将ptr1赋值给ptr2来共享ptr1所管理的资源。最后,我们输出ptr1和ptr2所管理对象的值,均为42,证明它们共享同一个内存资源。
总结
C++智能指针是一个重要的C++特性,它可以帮助我们管理指针资源,避免内存泄漏等问题。本文介绍了unique_ptr和shared_ptr的模拟实现方式,该实现方式可以帮助读者了解智能指针的本质和实现方式,并从而更好地应用C++智能指针。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 智能指针的模拟实现实例 - Python技术站