当前位置: 首页 > news >正文

打开无忧管理后台网站/刷神马seo排名首页排名

打开无忧管理后台网站,刷神马seo排名首页排名,用asp做网站优势,wordpress for saeC学习 四、智能指针总结前言智能指针的作用智能指针的特点shared_ptr共享指针循环引用unique_ptrweak_ptr手写一个shared_ptr类后记前言 之前分别学习了C的三种智能指针shared_ptr,unique_ptr,weak_ptr的使用,本篇来做一个总结。 智能指针的作用 C/C的一大特色就…

C++学习 四、智能指针总结

  • 前言
  • 智能指针的作用
  • 智能指针的特点
  • shared_ptr
    • 共享指针
    • 循环引用
  • unique_ptr
  • weak_ptr
  • 手写一个shared_ptr类
  • 后记

前言

之前分别学习了C++的三种智能指针shared_ptr,unique_ptr,weak_ptr的使用,本篇来做一个总结。

智能指针的作用

C/C++的一大特色就是指针,常用的堆指针分配方式需要手动进行内存空间的释放。

智能指针的出现为堆内存的管理提供了方便,降低了内存泄漏的风险。

智能指针的特点

智能指针实际上是通过类把堆指针进行封装,并通过重载运算符使得智能指针对象具有了类似普通指针的使用方式。

也就是说智能指针的使用类似普通指针,而实质上是一个对象。

智能指针最大的作用就是在合适的时间自动释放内存空间,防止出现内存泄漏的问题。

智能指针的生命周期与其作用域相关,超过作用域后将被销毁。

shared_ptr

共享指针

shared_ptr智能指针可以共享同一个普通指针,并具有引用计数块。

注意:shared_ptr的指针共享只能通过对象赋值操作、拷贝构造初始化实现。如果将一个普通指针分别给两个shared_ptr对象初始化,则会出现double free的问题。

因此,使用shared_ptr时,尽量不要与普通堆指针混用。

循环引用

循环引用时shared_ptr的常见问题。可以通过weak_ptr进行调试。

unique_ptr

unique_ptr智能指针独享内部指针的所有权,因此没有拷贝构造函数。

unique_ptr相比shared_ptr更适合指向数组,因为它重载了[]运算符:

std::unique_ptr<int []> vec(new int[8]);
vec[3] = 888;

weak_ptr

weak_ptr是shared_ptr的辅助指针,不具有普通指针的操作符。不能通过普通堆指针或nullptr构造。可以通过shared_ptr或者weak_ptr构造,但不会增加shared_ptr的引用计数。

weak_ptr常用于解决shared_ptr的循环引用问题。

手写一个shared_ptr类

要理解智能指针,我自己手写了一个类似shared_ptr的类实现:

#include <iostream>
#include <memory>
#include <assert.h>class A;
class B;template<typename T>
class mySmartPointer
{
private:T* ptr_;size_t* counter_;public:explicit mySmartPointer(T* ptr=nullptr) {ptr_ = ptr;if (ptr != nullptr) counter_ = new size_t(1);elsecounter_ = new size_t(0);};mySmartPointer(const mySmartPointer<T> &p) {ptr_ = p.ptr_;counter_ = p.counter_;if (p.ptr_ != nullptr)(*counter_)++;}~mySmartPointer() {(*this->counter_)--;if ((*this->counter_) == 0){delete this->ptr_;delete this->counter_;}};mySmartPointer<T>& operator=(const mySmartPointer<T> &p) {if (ptr_ == p.ptr_){return *this;}if (ptr_ != nullptr){(*counter_)--;if (*counter_ == 0){delete ptr_;delete counter_;}}ptr_ = p.ptr_;counter_ = p.counter_;(*counter_)++;return *this;}T& operator*() {assert(this->ptr_ == nullptr);return *(this->ptr_);}T* operator->() {assert(this->ptr_ == nullptr);return this->ptr_;}T* get() {return ptr_;}int use_count() {return *counter_;}bool unique() {return bool(*counter_ == 1);}void reset(T* p=nullptr) {if (ptr_ != nullptr){(*counter_)--;if (*counter_ == 0){delete ptr_;delete counter_;}}ptr_ = p;if (p != nullptr)counter_ = new size_t(1);elsecounter_ = new size_t(0.);}
};class A
{
public:std::shared_ptr<B> b_;
public:A(){std::cout << "construct A" << std::endl;}~A(){std::cout << "destroy A" << std::endl;}
};class B
{
public:std::shared_ptr<A> a_;
public:B(){std::cout << "construct B" << std::endl;}~B(){std::cout << "destroy B" << std::endl;}
};int main(int argc, char **argv) {// *** construct shared ptr *** ///mySmartPointer<double> m1(new double(0.6));std::cout << *m1 << std::endl;mySmartPointer<double> m2(m1);std::cout << *m2 << std::endl;std::cout << m1.use_count() << std::endl;std::cout << *(m1.get()) << std::endl;m1.reset();std::cout << m2.use_count() << std::endl;mySmartPointer<double> m3 = m2;std::cout << m2.use_count() << std::endl;//mySmartPointer<double> m4 = new double(5.1);//std::cout << *m4 << std::endl;return 1;
}

后记

智能指针的学习就先到这里。下一篇记录一下普通指针的使用。

http://www.lbrq.cn/news/827047.html

相关文章:

  • 怎么修改收录网站的标题/网站单向外链推广工具
  • 国家小城镇建设政策网站/seo推广公司
  • 哪里可以做网站平台/智慧教育
  • 各行各业网站建设/关键词优化工具有哪些
  • 盐城哪家做网站的正规/惠州百度推广优化排名
  • 网站在线服务模块怎么做测试/在线识别图片百度识图
  • 做个企业网网站怎么做/百度识图扫一扫
  • 设计商城的网站建设/品牌推广包括哪些内容
  • 做视频网站 许可证/seo外贸公司推广
  • 建设微信商城网站制作/优化seo方案
  • ecshop网站价格/重庆森林经典台词梁朝伟
  • 邯郸疫情最新情况 最新消息/北京seo公司工作
  • 网站新闻发布后前台不显示/seo关键词查询
  • 事业单位网站备案/百度seo多久能优化关键词
  • 微信分销网站建设哪家好/重庆网站页面优化
  • 企业网站建设方式/企业营销型网站建设
  • 河北交通建设投资集团公司网站/千峰培训可靠吗?
  • 太原网页设计师/seo技术学院
  • 企业自助建站软件/免费的api接口网站
  • 公司网站建设完成通知/seo优化按天扣费
  • 宜兴做网站的联系方式/市场seo是什么
  • 内容电商的网站如何做/发稿服务
  • 哈尔滨网站制作公司/seo免费诊断联系方式
  • 网站建设服务领域/公司网站优化
  • 怎么用新浪云做网站/网站优化排名软件网
  • 专业网站制作公司/商丘搜索引擎优化
  • 网站运营计划书/企业培训机构有哪些
  • 利为汇网站建设/国内最新消息新闻
  • 摄影网站建立/网络营销公司怎么注册
  • 金融网站可以做公安备案/推广关键词
  • 30天打牢数模基础-SVM讲解
  • 基于dcmtk的dicom工具 第六章 StoreSCU 图像发送
  • Python+ArcGIS+AI蒸散发与GPP估算|Penman-Monteith模型|FLUXNET数据处理|多源产品融合|专业科研绘图与可视化等
  • 研华PCI-1285/1285E 系列------(一概述)
  • Java行为型模式---状态模式
  • Python MCP与Excel增强智能:构建下一代数据处理和自动化解决方案