智能指针与普通指针用法相似,但智能指针可以在适当的时机自动释放内存。
三种智能指针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;//2
cout << *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,而在另一个线程中访问它。