当前位置: 首页 > news >正文

C++:智能指针

智能指针与普通指针用法相似,但智能指针可以在适当的时机自动释放内存。

三种智能指针shared_ptr、unique_ptr和weak_ptr。

内存资源管理不当:

1.资源已被释放,但指针未赋空——野指针

2.二次释放

3.未及时释放

使用智能指针可以避免忘记释放内存而导致的内存泄漏问题。

智能指针的本质是类(类模板),是对普通指针的封装。

头文件<memory>

#include<iostream>
#include<memory>
using namespace std;int main()
{int* p = nullptr;shared_ptr<int> sp;{shared_ptr<int> sp(new int(100));//<指向的类型>*sp = 200;cout << *sp << endl;p = sp.get();}cout << *p << endl;//根据*p的值,我们可知空间已经自动释放return 0;
}
#include<iostream>
#include<memory>
using namespace std;int main()
{int* p = nullptr;shared_ptr<int> sp1;{shared_ptr<int> sp(new int(100));*sp = 200;cout << *sp << endl;p = sp.get();sp1 = sp;}sp1.reset();//释放,若无此行代码*p=200,因为shared_ptr采用计数机制,值为0时释放空间cout << *p << endl;return 0;
}
{unique_ptr<int> up(new int(100));cout << *up << endl;p = up.get();
}
cout << *p << endl;
shared_ptr<int> sp(new int(100));
weak_ptr<int> wp(sp);
weak_ptr<int> wp1(sp);
shared_ptr<int> sp1 = sp;cout << wp.use_count() << endl;//2cout << *wp.lock() << endl;//100

总结: 

  • shared_ptr:是一种共享所有权的智能指针,它可以被多个 shared_ptr 对象共享。它使用引用计数来跟踪有多少个 shared_ptr 指向同一个对象,当引用计数为 0 时,关联的对象会被自动删除。
  • unique_ptr:是一种独占所有权的智能指针,它确保在其生命周期结束时,关联的对象会被自动删除。它不能被复制或共享,只能通过移动语义来转移所有权
  • weak_ptr:是一种弱引用的智能指针,它指向一个由 shared_ptr 管理的对象,但不会增加引用计数。weak_ptr 主要用于检查所管理的资源是否已经被释放,以及协助 shared_ptr 防止循环引用。weak_ptr可以通过lock函数获取到shared_ptr,如果所管理的对象已经被销毁,会返回一个空的shared_ptr。还可以通过expired函数检查所管理的资源是否存在,如果不存在返回true。

注意:智能指针不是线程安全的,在多线程环境下使用智能指针要注意以下几点:

  • 一个线程拥有了指针所有权之后,不要让其他线程使用该指针。
  • 当使用一个指针时,需要使用锁来保护该指针。
  • 不要让一个指针在一个线程中 delete,而在另一个线程中访问它。
http://www.lqws.cn/news/91.html

相关文章:

  • 今天遇到的bug
  • 设计模式-工厂方法模式
  • mysql一主多从 k8s部署实际案例
  • Vulhub靶场搭建(Ubuntu)
  • 【计算机网络】第2章:应用层—DNS