智能指针c++11(为什么 C++ 11 标准不加入 GC 功能)
本文目录
- 为什么 C++ 11 标准不加入 GC 功能
- c++智能指针有哪些
- C++ 智能指针在什么时候使用
- c++11智能指针对性能影响大吗
- C++11中类自己释放shared_ptr类型成员吗
- c++的c++11标准
- C++|深入理解智能指针
- c++智能指针有哪几种
- c++11智能指针(一) shared_ptr
- C++智能指针的几种用法
为什么 C++ 11 标准不加入 GC 功能
C++未提供语言层面的GC,但是其智能指针std::shared_ptr本质上就是基于引用计数的GC。只要避免循环引用,就跟其他语言的GC一样强大了,并且可控性较高。
c++智能指针有哪些
在C++编程中,智能指针绝对是很强大的用法,boost库里把这些指针用的出神入化,它可以简化程序员写代码的复杂度,不用去考虑代码分支路径导致的遗漏delete语法,也无须担心冗余delete导致的double free问题。但是,便利性也要求程序猿熟悉各种指针的用法,避免误用,反而带来其他问题。下面简要列下常用的智能指针,及其用法:1.scoped_ptr:这是最常用的智能指针,当你new一块内存后,把内存地址交给scoped_ptr管理,这样就不用显式调用delete了,当离开作用于后,该内存会被自动释放,如int* p = new int;scoped_ptr《int》 scoped_int_ptr(p);注意:无须再delete p;这样会double free。另外一个重要的点是: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++ 智能指针在什么时候使用
所属头文件:#include 《memory》所属命名空间及标识符:using std::shared_ptr;所属版本:C++98g++启用版本命令: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( const string s ):str(s) { cout 《《 "Object created!\n"; } ~Report() { cout 《《 "Object deleted!\n"; } void comment(string owner) const { 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++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 smart pointers made the program inefficient or simply crash and burn. I’ve catalogued them below for easy reference. 然而,在我使用它们广泛地被两个多年,我已经遇到许多情况下,不当使用C ++ 11智能指针所生成的程序效率低下或者干脆和好如初。我下面编目他们,以供参考。
C++11中类自己释放shared_ptr类型成员吗
是的,shared_ptr指针指向的堆内存会自动释放。C++11引入了3种智能指针,分别是:shared_ptr、unique_ptr、weak_ptr。它们实际上都是模板类,其堆内存在某一合适的时候会自动释放。但需要注意以下几点:1不能用同一个指向堆内存的普通指针创建多个shared_ptr指针2unique_ptr指针的引用计数始终为13weak_ptr指针不影响引用计数且只能和shared_ptr指针配合使用4要使用这3种指针,需#include《memory》using namespace std;
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函数与表示法;另一种的函数语法;对象构建的改良;显式虚函数重载;空指针;强类型枚举;角括号;显式类型转换;模板的别名;无限制的unions) 5.核心语言能力的提升(变长参数模板;新的字符串字面值;用户自定义的字面值;多任务存储器模型;thread-local的存储期限;使用或禁用对象的默认函数;long long int 类型;静态assertion;允许sizeof运算符作用在类型的数据成员上,无需明确的对象;) 6.C++标准程序库的变更(标准库组件的升级;线程支持;多元组类型;散列表;正则表达式;通用智能指针;可扩展的随机数功能;包装引用;多态函数对象包装器;用于元编程的类型属性;用于计算函数对象返回类型的统一方法)
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 “smart pointer. ” 我们经常遇到这样的情形:需要某种类似指针的东西,但内建的指针又做不了我们想要做的事情。在这些情形下,C++程序员可以使用一个“智能指针” 。 A smart 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 smart pointer uses the capabilities provided by a class’s constructors, destructor, and copy operations to control access to or keep track of what it points to in a way that a built-in pointer cannot. 智能指针是一个类类型,它乔装打扮成一个指针,但额外提供了内建指针所无法提供的能力。通常而言,一个智能指针通过使用类的构造函数、析构函数和复制操作符所提供的能力,来控制(或跟踪)对它所指向的东西的访问,而内建指针在这方面则无能为力。所有智能指针都重载 -》 和* 操作符,从而可以采用标准指针语法来使用它们(一些罕见的智能指针甚至还重载了-》* 操作符)。 All smart 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 smart pointers (in particular, smart 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 simple smart pointer template that performs a check that it’s not null before use: 另有一些智能指针(尤其是用作STL迭代器的指针)还重载了其他一些指针操作符,包括++、--、 、-、+=、-=以及等。智能指针通常采用类模板来实现,从而使它们可以指向不同类型的对象。下面是一个非常简单的智能指针模板,它执行一个检查, 确保在被使用之前不为空: Use of a smart 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 “consumed” 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 smart 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-》, 此操作符必须被重载为一个成员函数,并且具有一个非同寻常的性质,即当它被调用时,它并不被消耗掉(consumed),换句话说, 当我们写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 functions, and on and on. 智能指针在C++编程中广泛使用,从资源句柄到STL迭代器,再到引用计数指针,再到围绕成员函数的指针的包装器,等等。 ref 《C++ COMMON KNOWLEDGE: ESSENTIAL INTERMEDIATE PROGRAMMING》
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智能指针(一) 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更加安全(编译报错远比程序崩溃好得多)。
更多文章:
defense(defence和defense有什么区别 名词意思上有什么区别)
2024年7月3日 16:11
收件箱修复工具(如何在Outlook中查找并运行“收件箱修复工具”)
2024年6月29日 06:42
求三国志孔明传下载地址就是和曹操传差不多的那一款游戏,我以前只在PS上面玩过的?三国孔明传的下载地址
2024年6月27日 09:11
蜘蛛侠模拟器游戏下载(能说奥特曼格斗进化3蜘蛛侠版模拟器在哪下载)
2024年3月31日 04:46
电脑单机游戏、可玩性高点的、能存档的、6G以内的^_^?勿忘我打不开一打开就出现这个图是怎么回事啊
2024年6月25日 11:36
pokemon go 中国(为什么中国不能pokemon go)
2024年7月24日 16:04
迅雷下载时打开网页缓慢或无法打开怎么办?迅雷网络是用来干嘛的
2024年7月2日 00:15