C++智能指针应用方式体验

开发 后端
C++智能指针种类繁多,应方式灵活,在实际编程中给我们带来了非常大的好处。那么如何才能正确的应用呢?在这里将会进行详细介绍。

C++语言对于C语言功能的支持是完全的,它不但具有这些功能,而且还能在其基础上更加优化这些强大的功能。在这里我们将会为大家介绍下其中的C++智能指针的相关应用方法,以方便大家对这方面的理解。#t#

内存泄露是C++程序员都头疼的大问题。C++缺乏像JAVA、C#一样,拥有GC这么一项有利的武器,它将内存管理的部分权限交给了程序员。虽然GC的存在节约了开发、排错的时间与成本,但是C++为了追求运行速度而20年来坚决不予补充进其标准。(题外话:C++通过加大开发难度去换取执行速度的做法,在现在看来不知是否能给与正面的评价,还是留给将来再说吧。)

从此,在堆上申请了内存忘了释放、所造成的内存泄露的问题就一直困扰着C++程序员。也许为了稍许弥补没有垃圾回收器所造成的开发门槛高,各大厂商开发的C++库中都像COM学习引入智能指针试图解决部分目前存在的问题。

C++智能指针是存储指向动态分配(堆)对象指针的类, 用于生存期控制, 能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

说到C++智能指针,我们一定要看看标准C++库提供的“搞笑的”智能指针:auto_ptr。

标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,网上评论C++标准库时都说:“在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。”但目前的标准C++中,只有一种独苗智能指针:std::auto_ptr。

auto_ptr指针是一个RAII对象,它初始化时获得资源,析构时自动释放资源(生命期结束).它的缺点数不胜数:

1、auto_ptr要求一个对象只能有一个拥有者,严禁一物二主

2、缺少对引用数和数组的支持。

3、不可将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果。(这一条晕死一大片)。

4、auto_ptr在被复制的时候会传输所有权

反正由此可见:标准库的智能指针就是无甚大用。

在这样的情况下,C++标准委员会自然需要考虑引入新的智能指针。目前由C++标准委员会库工作组发起的Boost 组织开发了Boost系列智能指针。

在Boost中的C++智能指针有五种: scoped_ptr,scoped_array,shared_ptr,shared_array,weak_ptr.

前4种完全是针对标准库中的auto_ptr提出解决方案,如:scope_ptr是针对“auto_ptr在被复制的时候会传输所有权”这一弱点提出的。***一种没见过,看名字像是弱引用智能指针,我怀疑是不是类似于JAVA中弱引用一样,有待进一步学习。

责任编辑:曹凯 来源: 博客园
相关推荐

2023-11-17 11:48:08

智能指针C++

2010-12-17 10:07:59

2023-12-20 12:40:51

C++RAII编程

2021-09-09 17:05:36

C++智能指针语言

2024-01-24 11:44:44

C++智能指针开发

2015-07-27 11:34:03

Linux内核指针

2010-02-04 09:33:08

C++指针重载

2024-03-01 16:43:48

C++11智能指针内存

2011-07-12 13:01:00

CC++

2010-01-27 14:18:41

Android智能指针

2010-02-06 17:39:52

C++ strtok

2010-02-05 16:46:58

C++ TinyXml

2021-08-11 09:01:48

智能指针Box

2021-07-29 06:09:05

万能指针C语言void

2021-12-21 15:31:10

C++语言指针

2011-07-01 14:28:47

Qt 指针

2010-02-04 14:29:45

C++ typenam

2010-02-06 16:39:45

C++ assert(

2010-02-04 13:39:44

C++数组参数

2010-02-06 16:21:35

C++常规DLL
点赞
收藏

51CTO技术栈公众号