智能指针c++11(C++|深入理解智能指针)

:暂无数据 2025-08-28 04:00:01 0
其实智能指针c++11的问题并不复杂,但是又很多的朋友都不太了解C++|深入理解智能指针,因此呢,今天小编就来为大家分享智能指针c++11的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

C++|深入理解智能指针

It’s often the case that you’ll need something that behaves like a pointer, but a built-in pointer type just doesn’t do the job. In those cases, a C++ programmer will use a “**art pointer. ”

我们经常遇到这样的情形:需要某种类似指针的东西,但内建的指针又做不了我们想要做的事情。在这些情形下,C++程序员可以使用一个“智能指针” 。

A **art pointer is a class type that is tricked up to look and act like a pointer but that provides additional capability beyond that provided by a built-in pointer. Generally, a **art pointer uses the capabilities provided by a class’s c***tructors, destructor, and copy operati*** to control access to or keep track of what it points to in a way that a built-in pointer cannot.

智能指针是一个类类型,它乔装打扮成一个指针,但额外提供了内建指针所无法提供的能力。通常而言,一个智能指针通过使用类的构造函数、析构函数和复制操作符所提供的能力,来控制(或跟踪)对它所指向的东西的访问,而内建指针在这方面则无能为力。所有智能指针都重载 -》 和* 操作符,从而可以采用标准指针语法来使用它们(一些罕见的智能指针甚至还重载了-》* 操作符)。

All **art pointers overload the -》 and * operators so that they can be used with standard pointer syntax. (Some rare specimens even go so far as to overload the -》* operator; ) Other **art pointers (in particular, **art pointers used as STL iterators) overload other pointer operators, like ++, --, +, -, +=, -=, and . Smart pointers are often implemented as class templates so that they may refer to different types of objects. Here’s a very ****** **art pointer template that performs a check that it’s not null before use:

另有一些智能指针(尤其是用作STL迭代器的指针)还重载了其他一些指针操作符,包括++、--、 、-、+=、-=以及等。智能指针通常采用类模板来实现,从而使它们可以指向不同类型的对象。下面是一个非常简单的智能指针模板,它执行一个检查, 确保在被使用之前不为空:

Use of a **art pointer should be straightforward, mimicking the use of a built-in pointer:

智能指针的用法非常简单,酷似内建指针的用法:

The key to this facede is the overloaded operator -》. The -》 operator must be overloaded as a member and has a rather unusual property in that it is not “c***umed” when it is called. In other words, when we write s-》draw(), the compiler recognizes that s is not a pointer but a class object with an overloaded operator -》 (that is, that s is a **art pointer). This results in a call to the member overloaded operator, which returns (in this case) a Shape * built-in pointer. This pointer is then used to call Shape’s draw function. If you write this out longhand, you’ll get the following challenging expression: (s. operator -》())-》draw(), which contains two uses of the -》 operator, one overloaded, one built in.

在这个用法外表之下的关键点在于重载的operator-》, 此操作符必须被重载为一个成员函数,并且具有一个非同寻常的性质,即当它被调用时,它并不被消耗掉(c***umed),换句话说, 当我们写s-》draw()时, 编译器识别出s不是一个指针, 而是一个重载了operator-》的类对象(即s是一个智能指针)。这将导致对成员重载的操作符的调用,本例中返回一个Shape*内建指针。然后该指针被用于调用Shape的draw函数。如果采用普通写法来编写代码,将会得到如下具有挑战性的表达式(s.operator-》())-》draw(), 其中包含了两个-》操作符,一个是重载的版本,另一个是内建的版本。

Smart pointers also typically overload operator * as well as operator -》 so that they may be used to refer to nonclass types.

除了重载operator-》外,智能指针通常还重载operator *, 从而可以用它们指向不是类的类型,如下所示:

Smart pointers are used pervasively in C++ programming, from resource handles to STL iterators, to reference counting pointers, to wrappers around pointers to member functi***, and on and on.

智能指针在C++编程中广泛使用,从资源句柄到STL迭代器,再到引用计数指针,再到围绕成员函数的指针的包装器,等等。

ref

《C++ COMMON KNOWLEDGE: ESSENTIAL INTERMEDIATE PROGRAMMING》

c++智能指针有哪些

在C++编程中,智能指针绝对是很强大的用法,boost库里把这些指针用的出神入化,它可以简化程序员写代码的复杂度,不用去考虑代码分支路径导致的遗漏delete语法,也无须担心冗余delete导致的double ****问题。但是,便利性也要求程序猿熟悉各种指针的用法,避免误用,反而带来其他问题。下面简要列下常用的智能指针,及其用法:
1.scoped_ptr:这是最常用的智能指针,当你new一块内存后,把内存地址交给scoped_ptr管理,这样就不用显式调用delete了,当离开作用于后,该内存会被自动释放,如
int* p = new int;
scoped_ptr《int》 scoped_int_ptr(p);
注意:无须再delete p;这样会double ****。另外一个重要的点是:scoped_ptr不允许传递指针,即他的拷贝构造和赋值函数都是private的,不允许调用,所以你不能写如下代码
scoped_ptr《int》 scoped_int_ptr2 = scoped_int_ptr; // 不允许
2.auto_ptr:它和scoped_ptr用法基本是一致的,但是它允许指针传递,拷贝构造和赋值函数允许调用,故名思意,当发生赋值时,原对象的指针会转移给新对象,这时原对象的指针就为NULL了,不能再调用。所以,对指针要把握好,使用应谨慎。
3.shared_ptr:scoped_ptr一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。但是,shared_ptr注意不要有循环引用,否则会出现内存泄漏。例如:A和B对象互相引用,它们的引用计数都是1,当出了作用域之后,二者不能自动释放,出现了内存泄漏。
4.weak_ptr:是一种智能指针,它对被 std::shared_ptr 管理的对象存在非拥有性(“弱”)引用。在访问所引用的对象前必须先转换为 std::shared_ptr。
std::weak_ptr 用来表达临时所有权的概念:当某个对象只有存在时才需要被访问,而且随时可能被他人删除时,可以使用std::weak_ptr 来跟踪该对象。需要获得临时所有权时,则将其转换为 std::shared_ptr,此时如果原来的std::shared_ptr 被销毁,则该对象的生命期将被延长至这个临时的 std::shared_ptr 同样被销毁为止。
此外,std::weak_ptr 还可以用来避免 std::shared_ptr 的循环引用。

为什么 C++ 11 标准不加入 GC 功能

C++未提供语言层面的GC,但是其智能指针std::shared_ptr本质上就是基于引用计数的GC。只要避免循环引用,就跟其他语言的GC一样强大了,并且可控性较高。

c++11智能指针(一) shared_ptr

智能指针是存储动态分配对象指针的类,用于生命周期的控制。当指针离开其作用域时,自动销毁动态分配的空间,防止内存泄漏。
使用智能指针需要包含头文件#include《memory》

std::shared_ptr采用引用计数,每一个shared_ptr的拷贝都指向相同的内容,当最后一个shared_ptr析构的时候,内存被释放

当使用shared_ptr删除数组时,需要指定删除器
常用的写法有以下几种

C++智能指针的几种用法

一、auto_ptr模板
  auto_ptr与shared_ptr、unique_ptr都定义了类似指针的对象,可以将new到的地址赋给这一对象,当智能指针过期时,析构函数会调用delete函数,对象将被销毁,由此内存可以自动被释放。
二、shared_ptr模板
  先看代码:
auto_ptr p1 (new string("hello world!");
auto_ptr p2;
p2 = p1;
  在以上代码中,p1与p2指向同一对象,常规指针在释放内存时,系统会尝试删除同一对象两次。在auto_ptr中,对象的所有权会归于p2,p1将会变为野指针。shared_ptr则允许多个指针指向同一个对象,每多一个指针指向,计数器就会+1,同样在释放的时候,当数值减为0的时候即最后一个指针过期的时候才会调用delete函数。
三、unique_ptr模板
  同样为了避免多个指针指向,unique_ptr严格了所有权的概念,即我的就我的,不允许他人指向(如代码段二中,采用unique_ptr将会报错,而原代**编译通过但可能造成崩溃)。
四、总结
  需要多个指针指向一个对象时可使用shared_ptr,如指针数组。不需要多个指针指向一个对象可使用uniq_ptr,uniqu_ptr比auto_ptr更加安全(编译报错远比程序崩溃好得多)。

c++智能指针有哪几种

C++提供了4种智能指针用于对分配的内存进行自动释放,这些智能指针如下:
auto_ptr、unique_ptr、shared_ptr、weak_ptr。其中auto_ptr在C++98标准引入,后三种在C++11标准中加入。而auto_ptr已经被C++11所摒弃,建议使用后三种智能指针,这4种智能指针使用模板(template)实现。

c++11智能指针对性能影响大吗

我喜欢新的C ++ 11智能指针。在很多方面,他们是为godsent恨谁管理自己的记忆很多人。在我看来,它使教学C ++新人容易得多。
However, in the two plus years that I’ve been using them extensively, I’ve come across multiple cases where improper use of the C++ 11 **art pointers made the program inefficient or simply crash and burn. I’ve catalogued them below for easy reference.
然而,在我使用它们广泛地被两个多年,我已经遇到许多情况下,不当使用C ++ 11智能指针所生成的程序效率低下或者干脆和好如初。我下面编目他们,以供参考。

C++ 智能指针在什么时候使用

所属头文件:#include 《memory》
所属命名空间及标识符:using std::shared_ptr;
所属版本:C++98
g++启用版本命令:g++ -std=c++98 -c -o
补充:
如果启用c++11及以上标准,即g++ -std=c++11 -c -o,编译时会有一个警告信息提示
warning:‘auto_ptr’ is deprecated (‘auto_ptr‘被反对使用)
存在很多种智能指针,其中最有名的应该是C++98标准中的“自动指针”std::auto_ptr,它部分解决了获取资源自动释放的问题,例如:
#include 《memory》
#include 《iostream》
#include 《string》
using std::cin;
using std::cout;
using std::string;
using std::auto_ptr;
class Report
{
private:
std::string str;
public:
Report( c***t string s ):str(s) { cout 《《 "Object created!\n"; }
~Report() { cout 《《 "Object deleted!\n"; }
void comment(string owner) c***t { cout 《《 owner 《《 str 《《 "\n"; }
};
int main(void)
{
auto_ptr《Report》 ps (new Report("Using auto_ptr."));
ps-》comment(string("ps:"));
auto_ptr《Report》 p1;
p1 = ps; //赋值完毕后ps已经失去对内存对象的所有权,不可再使用
p1-》comment(string("p1:"));
//ps-》comment(string("after p1=ps:")); //error,Segmentation faul
}
/*Result:
Object created!
Using auto_ptr.
Object deleted!
*/
auto_ptr的构造函数接受new操作符或者对象工厂创建出的对象指针作为参数,从而代理了原始指针。虽然它是一个对象,但因为重载了 operator*后operator-》,其行为非常类似指针,可以把它用在大多数普通指针可用的地方。当退出作用域时(离开作用域或异 常),C++会保证auto_ptr对象销毁,调用auto_ptr的析构函数,进而使用delete操作符删除原始指针释放资源。
auto_ptr很好用,被包含在C++标准库中令它在世界范围内被广泛使用,使用智能指针的思想、用法深入人心。但标注库没有覆盖智能指针的全部领域,尤其最重要的引用计数型智能指针。

c++的c++11标准

  c++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布 ,并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于C++11标准的草案(仅上的修正)。此次标准为C++98发布后13年来第一次重大修正。
  1.对C++核心语言的扩充
  2.核心语言运行期的强化(右值引用和 move 语义;泛化的常数表达式;对POD定义的修正)
  3.核心语言建构期表现的加强(外部模板)
  4.核心语言使用性的加强(初始化列表;统一的初始化;类型推导;以范围为基础的 for 循环;Lambda函数与表示法;另一种的函数语法;对象构建的改良;显式虚函数重载;空指针;强类型枚举;角括号;显式类型转换;模板的别名;无限制的uni***)
  5.核心语言能力的提升(变长参数模板;新的字符串字面值;用户自定义的字面值;多任务存储器模型;thread-local的存储期限;使用或禁用对象的默认函数;long long int 类型;静态assertion;允许sizeof运算符作用在类型的数据成员上,无需明确的对象;)
  6.C++标准程序库的变更(标准库组件的升级;线程支持;多元组类型;散列表;正则表达式;通用智能指针;可扩展的随机数功能;包装引用;多态函数对象包装器;用于元编程的类型属性;用于计算函数对象返回类型的统一方法)

C++11中类自己释放shared_ptr类型成员吗

是的,shared_ptr指针指向的堆内存会自动释放。
C++11引入了3种智能指针,分别是:shared_ptr、unique_ptr、weak_ptr。它们实际上都是模板类,其堆内存在某一合适的时候会自动释放。
但需要注意以下几点:
1
不能用同一个指向堆内存的普通指针创建多个shared_ptr指针
2
unique_ptr指针的引用计数始终为1
3
weak_ptr指针不影响引用计数且只能和shared_ptr指针配合使用
4
要使用这3种指针,需
#include《memory》
using namespace std;

C++|深入理解智能指针的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于C++|深入理解智能指针、C++|深入理解智能指针的信息别忘了在本站进行查找哦。
本文编辑:admin

更多文章:


java后端代码例子(java 后台代码中怎么用beetl)

java后端代码例子(java 后台代码中怎么用beetl)

其实java后端代码例子的问题并不复杂,但是又很多的朋友都不太了解java 后台代码中怎么用beetl,因此呢,今天小编就来为大家分享java后端代码例子的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

网页平面设计(网页设计与平面设计的区别有哪些)

网页平面设计(网页设计与平面设计的区别有哪些)

大家好,网页平面设计相信很多的网友都不是很明白,包括网页设计与平面设计的区别有哪些也是一样,不过没有关系,接下来就来为大家分享关于网页平面设计和网页设计与平面设计的区别有哪些的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧

delegates英语怎么读(代表英文怎么说)

delegates英语怎么读(代表英文怎么说)

本篇文章给大家谈谈delegates英语怎么读,以及代表英文怎么说对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

mid函数的使用方法access(在ACCESS里怎么用MID函数从身份证信息里提取出出生年月日啊)

mid函数的使用方法access(在ACCESS里怎么用MID函数从身份证信息里提取出出生年月日啊)

本篇文章给大家谈谈mid函数的使用方法access,以及在ACCESS里怎么用MID函数从身份证信息里提取出出生年月日啊对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

opopy18手机怎么截屏?美的炒菜机PY18-X1S怎么样使用说明

opopy18手机怎么截屏?美的炒菜机PY18-X1S怎么样使用说明

这篇文章给大家聊聊关于py18,以及opopy18手机怎么截屏对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

fluence的用法(有关influence的用法及其词性变化的用法)

fluence的用法(有关influence的用法及其词性变化的用法)

这篇文章给大家聊聊关于fluence的用法,以及有关influence的用法及其词性变化的用法对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

display x官网(求高人指点买笔记本怎么验机! 谢谢了)

display x官网(求高人指点买笔记本怎么验机! 谢谢了)

各位老铁们好,相信很多人对display x官网都不是特别的了解,因此呢,今天就来为大家分享下关于display x官网以及求高人指点买笔记本怎么验机! 谢谢了的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

网课之家网站(哪里有免费的高中网课看)

网课之家网站(哪里有免费的高中网课看)

其实网课之家网站的问题并不复杂,但是又很多的朋友都不太了解哪里有免费的高中网课看,因此呢,今天小编就来为大家分享网课之家网站的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

vs2017和vs2019哪个好(visual studio哪个版本好用些)

vs2017和vs2019哪个好(visual studio哪个版本好用些)

大家好,vs2017和vs2019哪个好相信很多的网友都不是很明白,包括visual studio哪个版本好用些也是一样,不过没有关系,接下来就来为大家分享关于vs2017和vs2019哪个好和visual studio哪个版本好用些的一些

php资源网源码(php网站源码 核心代码是什么意思)

php资源网源码(php网站源码 核心代码是什么意思)

大家好,php资源网源码相信很多的网友都不是很明白,包括php网站源码 核心代码是什么意思也是一样,不过没有关系,接下来就来为大家分享关于php资源网源码和php网站源码 核心代码是什么意思的一些知识点,大家可以关注收藏,免得下次来找不到哦

最近更新

热门文章

口语100下载(口语100电脑版怎样下载)
2025-06-27 09:00:02 浏览:10
标签列表