前言
本次笔记记录如下知识点
- 智能指针的原理
- unique_ptr的原理及作用
- shared_ptr的原理及作用
- weak_ptr的原理及作用
一、智能指针的原理
- 智能指针的产生:在C++中程序员为了提高程序的效率,对堆内存管理会非常的频繁,为了不造成堆内存泄露,所以使用智能指针可以更好的管理堆内存。
- 智能指针的原理:智能指针是一个类,这个类中会在构造函数中传入一个普通的指针,在析构中释放这个指针。智能指针的类是栈上的对象,智能指针指向堆上开辟的空间,函数结束时,栈上的函数会自动被释放,智能指针指向的内存也会随之消失,防止内存泄漏。
二、unique_ptr的原理及作用
1、unique_ptr的作用
- unique_ptr唯一拥有其所指向的对象,同一时刻,unique_ptr独占所指对象。不能拷贝构造和拷贝赋值,支持转移语义。
2、unique_ptr的实现原理
- unique_ptr本质上是一个类,只是可以像一个指针一样使用,首先释放指针内存这个操作我们可以在析构函数中进行delete的操作,之后可以在类中把拷贝构造函数和拷贝赋值声明为private,这样就不可以对指针指向进行拷贝了,从而实现了独占的方式。
代码实现示例如下
template <class T,class D = default_delete<T>>
class unique_ptr {
public:
//保存传入的指针
typedef some_define pointer;
typedef T element_type;
//构造函数
concept unique_ptr() noexcept;
explicit unique_ptr(pointer p) noexcept;
//析构函数
~unique_ptr();
//转移语义赋值
unique_ptr& operator=(unique_ptr&& u) noexcept;
//获取原始指针
pointer get() const noexcept;
//释放指针的管理权
pointer release() noexcept;
//禁止拷贝
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
};
3、unique_ptr中的使用
代码示例如下
#include <vector>
class Example
{
public:
Example(int param = 0)
{
number = param;
cout << "Example: " << number << endl;
}
~Example() {
cout << "~Example: " << number << endl; }
void test_print() {
cout << "in test print: number = " << number << endl; }
void set_number(int num) {
number = num; }
private:
int number;
};
int main()
{
//1、测试unique_ptr中的各种函数
unique_ptr<Example> ptr(new Example(1));
ptr.get()->test_print(); //获取指针打印结果
ptr->set_number(10); //设置值
ptr