广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++中智能指针的用法详解
  • 665
分享到

C/C++中智能指针的用法详解

C++智能指针使用C++智能指针 2023-01-04 12:01:03 665人浏览 安东尼
摘要

目录前言一、什么是智能指针二、使用方法1.shared_ptr2.unique_ptr3.weak_ptr前言 本章主要介绍一些C/C++中智能指针的实现原理以及如何使用 一、什么是

前言

本章主要介绍一些C/C++中智能指针的实现原理以及如何使用

一、什么是智能指针

C/c++中,指针是一个非常重要的概念,其强大但也麻烦

麻烦之处就在于一旦你申请了内存,那就必须要手动去释放内容,否则就会造成内存泄漏

当然了,在代码量少的情况下你可能会不以为意,因为这点内存即使泄露了也根本看不出来,而且一旦程序执行结束,所有内存都会被系统释放

但如果一旦写比较大点的项目,内存管理就显得很重要了,比如QQ,微信等等,一般都是一直挂着的

如果挂几个小时就把电脑内存耗干净了,瞬间电脑变卡,谁还用啊

所以智能指针的作用就是防止我们麻痹大意忘记释放内存,帮助我们管理内存的

当然也有多次释放一个指针,导致程序崩溃的问题也能就此解决

二、使用方法

虽然智能指针听着很高级,但使用起来并不算复杂,熟悉之后,其实和普通指针差别不大。但会更加好用

自C++11之后,智能指针共有三个:shared_ptr、unique_ptr、weak_ptr

1.shared_ptr

看名字就知道,它是可以分享的指针,其使用方法很简单:

比如这里有一个类:

class User {
public:
	User() {
		cout << "这是构造函数" << endl;
	}
	~User()
	{
		cout << "这是析构函数" << endl;
	}

	void TestFun() {
		cout << "这是一个测试函数" << endl;
	}

};

然后使用共享智能指针:

#include<iOStream>
using namespace std;
//上面的那个类可以放在这里
int main() {
	shared_ptr<User> p(new User());
	shared_ptr<User> p1 = p;
	shared_ptr<User> p2 = p;

	p->TestFun(); //调用函数的方式和指针一样
	cout << p.use_count() << endl; //输出共享个数
}

即:通过模板参数,传入要构造的指针类型,然后在初始化的时候,就可以直接new一个对象即可

因为是共享的,所以它还能互相赋值,并可以用函数use_count返回当前共享的个数

其使用方法,如调用类的函数和属性之类的,就和普通的指针一样,用->进行调用即可,但是却不需要我们去亲自清理内存了!

看,现在我们并没有清理内存,但这个类的析构函数却被调用了!这就说明内存已经被正常释放了

这就是智能指针的好处!

但智能指针写着有点麻烦,每次声明其类型都有一长串,所以一般我们会对指针进行重定义,达到简化的目的:

typedef shared_ptr<User> SPUser;
int main() {
    SPUser p(new User());
    SPUser p1 = p;
    SPUser p2 = p;
    p->TestFun(); //调用函数的方式和指针一样
    cout << p.use_count() << endl; //输出共享个数
}

2.unique_ptr

上面的共享指针的使用方法和普通指针区别并不大

但有时候,我们想要某个对象同时只能存在一份,即不允许像共享指针那样,可以到处随意赋值给别人

这时候就可以用unique_ptr,其使用方法如下:

typedef unique_ptr<User> UPUser; //重新定义一个名称,便于使用
int main() {
	UPUser p(new User);
	//UPUser p1 = p; //错误,不能进行赋值
	UPUser p2;
	p2.swap(p); //但可以交换,即p2现在保存有变量,但p变为了空指针
	if (p == nullptr) {
		cout << "p为空指针" << endl;
	}
	p2->TestFun(); //正常调用

	UPUser p3 = move(p2); //也可以用move函数移动
	if (p2 == nullptr) { //此时p2就是空指针
		cout << "p2为空指针" << endl;
	}
	p3->TestFun(); //p3则保存对象指针
}

可以看到,它的使用方法其实和共享指针是差不多的,唯一不同之处就是,它内部的指针值,同一时刻只能存在一份

即,你不能对它进行任何形式的复制,但是可以移动

3.weak_ptr

这个智能指针用的不太多,因为它本身并没有太多实际的用途,而是主要作为shared_ptr的一个辅助类存在

比如有多少指向相同的 shared_ptr 指针、shared_ptr 指针指向的堆内存是否已经被释放等等。

其使用方法如下:

typedef shared_ptr<User> SPUser;
typedef weak_ptr<User> WPUser;
int main() {
	
	SPUser p(new User());
	SPUser p1 = p;
	SPUser p2 = p;

	WPUser wp(p);
	cout << wp.use_count() << endl; //查看这个共享指针使用次数
	cout << wp.expired() << endl; //判断这个指针是否为空,或者内存已经被释放

}

到此这篇关于C/C++中智能指针的用法详解的文章就介绍到这了,更多相关C++智能指针内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C/C++中智能指针的用法详解

本文链接: https://www.lsjlt.com/news/176677.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++中智能指针的用法详解
    目录前言一、什么是智能指针二、使用方法1.shared_ptr2.unique_ptr3.weak_ptr前言 本章主要介绍一些C/C++中智能指针的实现原理以及如何使用 一、什么是...
    99+
    2023-01-04
    C++智能指针使用 C++智能指针
  • C++SmartPointer智能指针详解
    目录一、为啥使用智能指针呢二、shared_ptr智能指针三、unique_ptr智能指针四、weak_ptr智能指针五、智能指针怎么解决交叉引用,造成的内存泄漏5.1 交叉引用的栗...
    99+
    2022-11-13
  • 【C++】智能指针(RAII)详解
        我们在上篇文章中(异常处理详解)提到了 RAII 。那么本篇文章会对此进行详解。重点是智能指针的详解。其中会讲解到 RAII 思想、auto_ptr、unique_ptr、shared_ptr、weak_ptr、循环引用问题。希...
    99+
    2023-09-06
    c++ 开发语言
  • C++智能指针之shared_ptr详解
    目录共享指针的初始化方式常用成员函数shared_ptr内存模型make_shared的优缺点优点缺点引用计数比较运算符总结共享指针的初始化方式 1.裸指针直接初始化,但不能通过隐式...
    99+
    2022-11-13
  • C++ STL 四种智能指针的用法详解
    目录0.前言1.unique_ptr2.auto_ptr3.shared_ptr 3.1 简介3.2 通过辅助类模拟实现 shared_ptr4.weak_ptr4.1 简...
    99+
    2022-11-12
  • C++超详细讲解智能指针
    目录一、内存泄漏-永恒的话题二、深度思考三、智能指针分析四、小结一、内存泄漏-永恒的话题 动态申请堆空间,用完后不归还C++ 语言中没有垃圾回收的机制指针无法控制所指堆空间的生命周期...
    99+
    2022-11-13
  • c++智能指针的超详细讲解
    目录1.什么是智能指针2.原始指针的问题3.unique_ptr4.shared_ptr5.shared_ptr使用需要注意的点5.1 不能将一个原始指针初始化多个shared_pt...
    99+
    2022-11-13
  • C++特性之智能指针shared_ptr详解
    目录1.创建指针对象2.分离关联的原始指针3.与普通指针比较4.NULL检测shared_ptr 是C++11提供的一种智能指针类,它足够智能,可以在任何地方都不使用时自动删除相关指...
    99+
    2022-12-08
    C++智能指针shared_ptr C++智能指针 C++ shared_ptr
  • C++ 智能指针代码解析
    目录前言1,aoto_ptr2,unique_ptr3,share_ptr4, weak_ptr总结前言 如果在程序中使用new从堆分配内存,等到不再需要时,应使用delete将其释...
    99+
    2022-11-12
  • C++中Boost的智能指针scoped_ptr
    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #includ...
    99+
    2022-11-13
  • C++中Boost的智能指针shared_ptr
    boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限。顾名思义,boost::shar...
    99+
    2022-11-13
  • C++中Boost的智能指针weak_ptr
    循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下: #include <string> #includ...
    99+
    2022-11-13
  • c++智能指针unique_ptr的使用
    目录1.为什么需要unique_ptr2.什么是unique_ptr3.unique_ptr特性4.如何使用unique_ptr4.1简单使用4.2指向数组5.unique_ptr需...
    99+
    2022-11-12
  • C++中如何使用智能指针
    这期内容当中小编将会给大家带来有关C++中如何使用智能指针,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内存泄露是C++程序员都头疼的大问题。C++缺乏像JAVA、C#一样,拥有GC这么一项有利的武器,它...
    99+
    2023-06-17
  • C++中怎么使用智能指针
    这篇文章给大家介绍C++中怎么使用智能指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、为什么要使用智能指针一句话带过:智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而...
    99+
    2023-06-20
  • C++11中的智能指针怎么用
    本篇内容介绍了“C++11中的智能指针怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!函数原型:shared_ptr& oper...
    99+
    2023-06-19
  • 深入了解C++智能指针的使用
    目录一、C++11智能指针概述二、C++98中的智能指针三、C++11中的智能指针1.unique_ptr2.shared_ptr3.weak_ptr一、C++11智能指针概述 在C...
    99+
    2022-11-13
  • 一篇文章带你了解C++智能指针详解
    目录为什么要有智能指针?智能指针的使用及原理RALLshared_ptr的使用注意事项创建多个 shared_ptr 不能拥有同一个对象shared_ptr 的销毁shared_pt...
    99+
    2022-11-12
  • C++的智能指针你真的了解吗
    目录什么是RAIIRAII的原理裸指针存在的问题auto_ptrunique_ptr总结什么是RAII RAII(Resource Acquisition Is Initializa...
    99+
    2022-11-13
  • C++深入分析讲解智能指针
    目录1.简介2.unique_ptr指针(独占指针)3.shared_ptr指针(共享所有权)4.weak_ptr(辅助作用)5.自实现初级版智能指针6.总结1.简介 程序运行时存在...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作