智能指针 偏执的太偏执、 2022-05-17 07:29 359阅读 0赞 在C++中,如果指针使用不当,比如没有及时释放指针所指向的内存,或者野指针等,会造成系统发生不可预估的错误,为了防止这一情况的发生,C++ STL提供了一系列智能指针类型 智能指针简单来说就是系统会帮助我们进行管理,并及时释放占用的内存,简单结构如下 template<class T> class Smart_Pointer { private: T *_ptr; public: Smart_Pointer(T* ptr):_ptr{ptr} {} ~Smart_Pointer() { delete _ptr; _ptr = nullptr; } T& operator*() { //为什么不能重载.?因为.不能被重载.且对象是一个指针,使用方式是(*P).xxxx()或者p->xxxx() return *_ptr; } T* operator->() { return _ptr; } }; C++11 STL提供了三种常用只能指针,分别是: **unique\_ptr** **Shared\_ptr** **Weak\_ptr;** ### Shared\_ptr: ### 智能指针shared\_ptr允许多个指针指向同一个对象;unique\_ptr则”独占”所指向的对象 类似vector,只能指针也是模板,需要提供相关的类型 Shared_ptr<string> p1 //可以指向string的智能指针类型 默认初始化的智能指针保存着一个空指针,同时我们可以通过make\_shared来初始化指针 这是最安全的分配和使用动态内存的方法,此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared\_ptr Shared_ptr<int> p3 = make_shared<int>(42); //调用构造函数 //指向一个值为42的int的shared_ptr 我们可以认为每个shared\_ptr都有一个关联的计数器,通常称为引用计数, 当我们将一个ptr作为参数传递给另一个ptr,或是初始化,或是作为函数返回值: 比如复制操作:auto p4(p3); 它的引用计数器就会加一。 当赋予一个新值或是被销毁,就会进行递减,比如r和q是两个shared\_ptr 如r = q; 给r赋予q的地址,r的原地址销毁,引用计数器减一,q加一 , 我们可以通过use\_count()函数来查看引用计数情况: spI1.use_count() Shared\_ptr 自动销毁所管理的对象 当指向一个对象的最后一个shared\_ptr被销毁以后,shared\_ptr类会自动销毁此类对象。它是通过另一个特殊成员函数—析构函数完成销毁工作的(当引用计数变为0后,就自动销毁了) ### Unique\_ptr: ### unique\_ptr独享所有权,一个非空的std::unique\_ptr总是拥有它所指向的资源 转移一个std::unique\_ptr也会把源指针转移给目标指针 为了防止指向相同资源,拷贝是不被允许的 unique_ptr<int[]> pI1(new int[5]{ 1,2,3,4,5 }); cout << pI1[3] << endl; auto PI2 = move(pI1); //不可被复制,只能通过move右值引用 由于unique\_ptr不能拷贝,因此我们只能使用move()进行传值 **weak\_ptr** Weak\_ptr是为了配合shared\_ptr而引入的一种智能指针 它更像是shared\_ptr的一个助手而非智能指针,因为它不具有普通指针的行为 它获得观测权但不占用资源,它的构造不会引起引用计数的增加 weak_ptr<int> wpI1 = spI1; wpI1.use_count() //并没有引起计数器的增加 同时weak\_ptr提供lock()函数来判断shared\_ptr是否存在,如果存在,weak\_ptr返回一个指向共享对象的shared\_ptr,否则返回空指针 if(shared_ptr<int> np = wpI1.lock()) { //在if中,np与wpI1共享对象 } **智能指针的释放:** **spI1.reset();**
相关 智能指针 C++里面的四个智能指针分别是:auto\_ptr,shared\_ptr,weak\_ptr,unique\_ptr,其中后三个是C++11支持的,第一个auto\_ptr已 客官°小女子只卖身不卖艺/ 2023年10月09日 12:14/ 0 赞/ 157 阅读
相关 智能指针 智能指针 1.引入使用计数 定义智能指针的通用技术是采用一个使用计数。智能指针将一个计数器与类指向的对象相关联。使用计数跟踪该类有多少个对象共享同一指针。使用计数为0时 Bertha 。/ 2023年06月23日 15:29/ 0 赞/ 109 阅读
相关 智能指针 智能指针 智能指针的智能,体现在智能指针能够在每次完成工作之后自动释放占用的空间。 我们通常使用的裸指针,使用完成后需要通过delete或者free来进行释放,那么如 向右看齐/ 2023年06月21日 03:46/ 0 赞/ 43 阅读
相关 智能指针 有三个智能指针,auto\_ptr(弃用)、unique\_ptr、shared\_ptr. 智能指针可以自动跟踪动态内存,在其过期时自动释放。 include< ゝ一纸荒年。/ 2023年02月21日 14:05/ 0 赞/ 142 阅读
相关 智能指针 class MyClass { public: MyClass(int a){}; ~MyClass() 逃离我推掉我的手/ 2023年01月03日 12:54/ 0 赞/ 282 阅读
相关 c++ 智能指针 前言 C++里面的四个智能指针: auto\_ptr, unique\_ptr,shared\_ptr, weak\_ptr 其中后三个是C++11支持,并且第一个已经被 左手的ㄟ右手/ 2022年09月07日 12:15/ 0 赞/ 371 阅读
相关 智能指针 scoped\_ptr解析 《超越C++标准库-Boost库导论》 头文件: "boost/scoped\_ptr.hpp" boost::scoped\_ptr 用于确 超、凢脫俗/ 2022年08月09日 16:37/ 0 赞/ 350 阅读
相关 智能指针 RAII(Resource Acquisition Is Initialization): 资源分配即初始化,定义封装一个类,用来实现调用构造函数时就可完成资源的分 梦里梦外;/ 2022年07月17日 03:43/ 0 赞/ 320 阅读
相关 智能指针 在C++中,如果指针使用不当,比如没有及时释放指针所指向的内存,或者野指针等,会造成系统发生不可预估的错误,为了防止这一情况的发生,C++ STL提供了一系列智能指针类型 智 偏执的太偏执、/ 2022年05月17日 07:29/ 0 赞/ 360 阅读
相关 智能指针 智能指针 在java中如果在堆上开辟内存是不需要手动释放的,我们叫做智能指针;但是在C++中如果用new在堆上开辟了空间,我们需要用delete进行手动释放,否则造 悠悠/ 2022年03月18日 11:54/ 0 赞/ 384 阅读
还没有评论,来说两句吧...