专业的建站公司推广,网站新闻模块代码,深圳工业设计展2021,公司网站建设任务书作者主页#xff1a; 作者主页 本篇博客专栏#xff1a;C 创作时间 #xff1a;2024年8月20日 一#xff0c;什么是智能指针 在C中没有垃圾回收机制#xff0c;必须自己释放分配的内存#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针… 作者主页 作者主页 本篇博客专栏C 创作时间 2024年8月20日 一什么是智能指针 在C中没有垃圾回收机制必须自己释放分配的内存否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针smart pointer。智能指针是存储指向动态分配堆对象指针的类用于生存期的控制能够确保在离开指针所在作用域时自动地销毁动态分配的对象防止内存泄露。智能指针的核心实现技术是引用计数每使用它一次内部引用计数加1每析构一次内部的引用计数减1减为0时删除所指向的堆内存。 c中用的最多的是下面三种智能指针 C11中提供了三种智能指针使用这些智能指针时需要引用头文件memory std::shared_ptr共享的智能指针std::unique_ptr独占的智能指针std::weak_ptr弱引用的智能指针它不共享指针不能操作资源是用来监视shared_ptr的。 二共享的智能指针shared_ptr
首先了解一下基本概念再看代码会学的很快
1. shared_ptr的初始化 共享智能指针是指多个智能指针可以同时管理同一块有效的内存共享智能指针shared_ptr 是一个模板类如果要进行初始化有三种方式通过构造函数、std::make_shared辅助函数以及reset方法。共享智能指针对象初始化完毕之后就指向了要管理的那块堆内存如果想要查看当前有多少个智能指针同时管理着这块内存可以使用共享智能指针提供的一个成员函数use_count 2.获取原始指针 对应基础数据类型来说通过操作智能指针和操作智能指针管理的内存效果是一样的可以直接完成数据的读写。但是如果共享智能指针管理的是一个对象那么就需要取出原始内存的地址再操作可以调用共享智能指针类提供的get()方法得到原始地址 3. 指定删除器 当智能指针管理的内存对应的引用计数变为0的时候这块内存就会被智能指针析构掉了。另外我们在初始化智能指针的时候也可以自己指定删除动作这个删除操作对应的函数被称之为删除器这个删除器函数本质是一个回调函数我们只需要进行实现其调用是由智能指针完成的。 下面我们来看一下代码如何实现
#pragma once
#include iostream
#include functionalnamespace zy
{templateclass Tclass shared_ptr{public:shared_ptr(T* ptr nullptr) : _ptr(ptr), _pcount(ptr ? new int(1) : nullptr){std::cout shared_ptr(T* ptr) std::endl;}templateclass Dshared_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;fuctionvoid(T* ptr)_del [](T* ptr) {delete ptr};};
} 三独占的智能指针unique_ptr 1. 初始化 std::unique_ptr是一个独占型的智能指针它不允许其他的智能指针共享其内部的指针可以通过它的构造函数初始化一个独占智能指针对象但是不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr。 2. 删除器 unique_ptr指定删除器和shared_ptr指定删除器是有区别的unique_ptr指定删除器的时候需要确定删除器的类型所以不能像shared_ptr那样直接指定删除器 #pragma once
#include iostreamtemplate 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_;}// 释放所管理的资源并将指针置为 nullptrvoid reset(T* ptr nullptr) {if (ptr_) {delete ptr_;}ptr_ ptr;}private:T* ptr_;
};
四 弱引用的智能指针weak_ptr 弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和-因为它不共享指针不能操作资源所以它的构造不会增加引用计数析构也不会减少引用计数它的主要作用就是作为一个旁观者监视shared_ptr中管理的资源是否存在。 1 初始化 弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和-因为它不共享指针不能操作资源所以它的构造不会增加引用计数析构也不会减少引用计数它的主要作用就是作为一个旁观者监视shared_ptr中管理的资源是否存在。 #include iostream
#include memory
using namespace std;int main()
{shared_ptrint sp(new int);weak_ptrint wp1;weak_ptrint wp2(wp1);weak_ptrint wp3(sp);weak_ptrint wp4;wp4 sp;weak_ptrint wp5;wp5 wp3;return 0;
}
weak_ptrint wp1;构造了一个空weak_ptr对象weak_ptrint wp2(wp1);通过一个空weak_ptr对象构造了另一个空weak_ptr对象weak_ptrint wp3(sp);通过一个shared_ptr对象构造了一个可用的weak_ptr实例对象wp4 sp;通过一个shared_ptr对象构造了一个可用的weak_ptr实例对象这是一个隐式类型转换wp5 wp3;通过一个weak_ptr对象构造了一个可用的weak_ptr实例对象 通过调用std::weak_ptr类提供的use_count()方法可以获得当前所观测资源的引用计数 2.常用函数 通过调用std::weak_ptr类提供的expired()方法来判断观测的资源是否已经被释放 通过调用std::weak_ptr类提供的lock()方法来获取管理所监测资源的shared_ptr对象 通过调用std::weak_ptr类提供的reset()方法来清空对象使其不监测任何资源 利用weak_ptr可以解决shared_ptr的一些问题 返回管理this的shared_ptr解决循环引用问题 最后
十分感谢你可以耐着性子把它读完和我可以坚持写到这里送几句话对你也对我
1.一个冷知识 屏蔽力是一个人最顶级的能力任何消耗你的人和事多看一眼都是你的不对。
2.你不用变得很外向内向挺好的但需要你发言的时候一定要勇敢。 正所谓君子可内敛不可懦弱面不公可起而论之。
3.成年人的世界只筛选不教育。
4.自律不是6点起床7点准时学习而是不管别人怎么说怎么看你也会坚持去做绝不打乱自己的节奏是一种自我的恒心。
5.你开始炫耀自己往往都是灾难的开始就像老子在《道德经》里写到光而不耀静水流深。
最后如果觉得我写的还不错请不要忘记点赞✌收藏✌加关注✌哦(ω)
愿我们一起加油奔向更美好的未来愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油为自己点赞