作者主页: 作者主页
本篇博客专栏:C++
创作时间 :2024年8月20日
一,什么是智能指针
- c++中用的最多的是下面三种智能指针
二,共享的智能指针shared_ptr
- 首先了解一下基本概念,再看代码,会学的很快
1. shared_ptr的初始化
2.获取原始指针
3. 指定删除器
下面我们来看一下代码如何实现:
#pragma once
#include <iostream>
#include <functional>
namespace zy
{
template<class T>
class shared_ptr
{
public:
shared_ptr(T* ptr = nullptr)
: _ptr(ptr)
, _pcount(ptr ? new int(1) : nullptr)
{
std::cout << "shared_ptr(T* ptr)" << std::endl;
}
template<class D>
shared_ptr(T* ptr = nullptr,D del)
: _ptr(ptr)
, _pcount(ptr ? new int(1) : nullptr)
, _del(del)
{}
shared_ptr(const shared_ptr& sp)
: _ptr(sp._ptr)
, _pcount(sp._pcount)
{
++(*_pcount);
std::cout << "Copy constructor" << std::endl;
}
shared_ptr& operator=(const shared_ptr& sp)
{
if (this != &sp)
{
// 释放当前对象管理的资源(如果有)
this->Realease();
_ptr = sp._ptr;
_pcount = sp._pcount;
++(*_pcount);
}
return *this;
}
~shared_ptr()
{
Realease();
}
void Realease()
{
if (_pcount && --(*_pcount) == 0)
{
//delete _ptr;
_del(_ptr);
delete _pcount;
_ptr = nullptr;
_pcount = nullptr;
}
}
T* get()
{
return _ptr;
}
int use_count()
{
return _pcount ? *_pcount : 0;
}
T& operator*() { return *_ptr; }
T* operator->() { return _ptr; }
private:
T* _ptr;
int* _pcount;
fuction<void(T* ptr)>_del = [](T* ptr) {delete ptr};
};
}
三,独占的智能指针unique_ptr
1. 初始化
2. 删除器
#pragma once
#include <iostream>
template <typename T>
class unique_ptr {
public:
// 构造函数,接受一个原始指针并接管其所有权
unique_ptr(T* ptr = nullptr)
: ptr_(ptr)
{}
// 移动构造函数,转移所有权
unique_ptr(unique_ptr&& other) noexcept : ptr_(other.ptr_) {
other.ptr_ = nullptr;
}
// 移动赋值运算符,转移所有权
unique_ptr& operator=(unique_ptr&& other) noexcept {
if (this!= &other) {
reset();
ptr_ = other.ptr_;
other.ptr_ = nullptr;
}
return *this;
}
// 析构函数,释放所管理的资源
~unique_ptr() {
reset();
}
// 解引用操作符
T& operator*() const {
return *ptr_;
}
// 箭头操作符
T* operator->() const {
return ptr_;
}
// 获取原始指针
T* get() const {
return ptr_;
}
// 释放所管理的资源并将指针置为 nullptr
void reset(T* ptr = nullptr) {
if (ptr_) {
delete ptr_;
}
ptr_ = ptr;
}
private:
T* ptr_;
};
四, 弱引用的智能指针weak_ptr
1 初始化
#include <iostream>
#include <memory>
using namespace std;
int main()
{
shared_ptr<int> sp(new int);
weak_ptr<int> wp1;
weak_ptr<int> wp2(wp1);
weak_ptr<int> wp3(sp);
weak_ptr<int> wp4;
wp4 = sp;
weak_ptr<int> wp5;
wp5 = wp3;
return 0;
}
- weak_ptr<int> wp1;构造了一个空weak_ptr对象
- weak_ptr<int> wp2(wp1);通过一个空weak_ptr对象构造了另一个空weak_ptr对象
- weak_ptr<int> wp3(sp);通过一个shared_ptr对象构造了一个可用的weak_ptr实例对象
- wp4 = sp;通过一个shared_ptr对象构造了一个可用的weak_ptr实例对象(这是一个隐式类型转换)
- wp5 = wp3;通过一个weak_ptr对象构造了一个可用的weak_ptr实例对象
- 通过调用
std::weak_ptr
类提供的use_count()
方法可以获得当前所观测资源的引用计数
2.常用函数
- 利用
weak_ptr可以解决shared_ptr的一些问题
最后:
十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:
1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。
2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。
3.成年人的世界,只筛选,不教育。
4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。
5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。
最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)
愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!