27.C++- 智能指针

2021-06-23 12:03

阅读:469

标签:explicit   auto_ptr   针对   log   出现   target   http   targe   成员   

智能指针

  • 在C++库中最重要的类模板之一
  • 智能指针实际上是将指针封装在一个类里,通过对象管理指针.

 

STL中的智能指针auto_ptr

头文件:

  • 生命周期结束时,自动摧毁指向的内存空间
  • 不能指向堆数组(因为auto_ptr的析构函数删除指针用的是delete,而不是delete[])
  • auto_ptr的构造函数为explicit类型,所以只能显示初始化,比如:
  • 提供get()成员函数,可以用来查看类里的指针地址.比如:
  • 一片堆空间只属于一个智能指针对象(因为多个指向相同地址的智能指针调用析构函数时,会出现bug)
  • 当auto_ptr被拷贝或赋值后,则自身的指针指向的地址会被抢占,比如:

 

初探auto_ptr智能指针

运行打印:

从结果可以看到,由于func()的生命周期结束,所以里面的auto_ptr指针自动就被释放了。

可以发现在调用p1=p2时, 首先会delete p1对象的类成员指针(调用~Test(1)析构函数),然后将p2对象的类成员指针赋值给p1(p1=0x8db1018), 最后修改p2指针地址为NULL(p2=0)

 

STL中的智能指针shared_ptr(需要C++11支持)

  • 带有引用计数机制,支持多个指针对象指向同一片内存(实现共享)
  • 提供swap()成员函数,用来交换两个相同类型的对象,比如:

 

  • 提供unique()成员函数, 判断该指针对象地址是否被其它指针对象引用
  • 提供get()成员函数,用来获取指针对象指向的地址
  • 提供reset()成员函数,将自身指针对象地址设为NULL,并将引用计数-1(当计数为0,会自动去delete内存)
  • 提供use_count()成员函数,可以用来查看引用计数个数,比如:

 

初探shared_ptr智能指针(以上个Test类为例分析)

运行打印:

从结果可以看到,我们把p1和p2都释放了后,由于count=0,便自动去delete Test指针了.

 

-weak_ptr

  • 配合shared_ptr而引入的一种智能指针

-unique_ptr

  • 只能一个指针对象指向一片内存空间(和auto_ptr类似),但是不能被拷贝和赋值(实现唯一性)

 

 

-QPointer 

  • 当其指向的对象被销毁时,本身会自动赋值为NULL(从而避免被多次释放和野指针)
  • 缺点在于,该模板类析构时,不会自动摧毁所指向的对象(需要手工delete)

-QSharedPointer 

  • 带有引用计数机制,支持多个指针对象指向同一片内存(实现共享)
  • 可以被自由地拷贝和赋值
  • 当引用计数为0(最后一个指针被摧毁)时,才删除指向的对象(和shared_ptr类似)

-QScopedPointer 

  • 优点在于生命期结束后会自动删除它所指的对象(不需要手工delete)
  • 不支持多个QScopedPointer指针对象指向同一片内存(不能共享)

示例:

 

 


文章来源:https://www.cnblogs.com/lifexy/p/8798415.html

27.C++- 智能指针

标签:explicit   auto_ptr   针对   log   出现   target   http   targe   成员   

原文地址:https://www.cnblogs.com/xiongjim/p/9674170.html


评论


亲,登录后才可以留言!