文章目录
- 前言
- 一、智能指针是什么?
- 二、示例
- 总结
前言
C++对于内存管理的要求很高,如果不及时释放对象内存,就可能会发生内存泄露或野指针等情况,鉴于这种情况,C++11提出了智能指针的概念。
一、智能指针是什么?
智能指针可以将指针封装为一个栈对象,当不需要使用时,会在析构函数中释放掉申请的内存,所有的智能指针类均包含于头文件 < memory> 内。
其原理是:通过重载*,->,(),=运算符来完成普通指针的功能,并定义了一些成员函数,如reset,swap ,use_count,get等。
C++ 常见的有三种智能指针:unique_ptr、shared_ptr、weak_ptr。
另外还有一个auto_ptr目前已不推荐使用,原因是经常会误用其指针赋值功能(将指向的对象转移到赋值的指针下,之前的指针会指向NULL)造成内存错误。
其中:
unique_ptr声明的指针只能指向唯一的对象,不能赋值给其他指针,但可以使用move方法移动内存到另一个指针指向的内存里。当对象销毁时会释放其持有的堆内存。
shared_ptr表示该类型的指针变量可以共享内存对象,同时可以使用use_count来统计引用次数。
std::weak_ptr 表示指针不控制对象的生命周期,只用于访问对象。其目的是协助 std::shared_ptr 工作,构造和析构不会引起引用计数的增加或减少,可以解决shared_ptr 互相引用导致的死锁问题。该类型指针没有重载*和->运算符,但可以使用expired方法来判断weak_ptr的对象是否被释放。多应用于事件对象的声明中。
二、示例
#include<iostream>
#include <memory>
using namespace std;void test1()
{//1unique_ptr<int> p1(new int(1));cout << *p1 << endl;//2unique_ptr<int> p2;p2.reset(new int(2));cout << *p2 << endl;//3,make_unique方法是C++14开发的unique_ptr<int> p3 = make_unique<int>(3);cout << *p3 << endl;
}void test2()
{//1shared_ptr<int> p1(new int(1));cout << *p1 << endl;//use_count方法用于获取当前资源的引用计数cout << "use count: " << p1.use_count() << endl;//2shared_ptr<int> p2;p2.reset(new int(2));cout << *p2 << endl;//3shared_ptr<int> p3;p3 = make_shared<int>(3);cout << *p3 << endl;//4,可以拷贝和赋值p1的资源shared_ptr<int> p4(p1);cout << *p4 << endl;//use_count方法用于获取当前资源的引用计数cout << "use count: " << p4.use_count() << endl;shared_ptr<int> p5 = p1;cout << *p5 << endl;//use_count方法用于获取当前资源的引用计数cout << "use count: " << p5.use_count() << endl;
}void test3()
{//创建一个shared_ptr指针shared_ptr<int> p1(new int(1));cout << *p1 <<endl;//将shared_ptr指针拷贝给weak_ptr指针weak_ptr<int> p2(p1);cout << "use count: " << p1.use_count() << endl;//赋值weak_ptr<int> p3 = p1;cout << "use count: " << p1.use_count() << endl;
}int main()
{/*test1();*//*test2();*/test3();system("pause");return 0;
}
总结
使用智能指针需要注意其使用场合。声明不需共享的对象,使用unique_ptr,需要共享,则使用shared_ptr,需要的时候用,不需要的时候不用,可以使用weak_ptr。