网站怎么做一盘优化排名,江苏省建设厅网站建造师强制注销,西安建设企业网站,株洲网站设计文章目录前言一、智能指针是什么#xff1f;二、示例总结前言
C对于内存管理的要求很高#xff0c;如果不及时释放对象内存#xff0c;就可能会发生内存泄露或野指针等情况#xff0c;鉴于这种情况#xff0c;C11提出了智能指针的概念。
一、智能指针是什么#xff1f;…
文章目录前言一、智能指针是什么二、示例总结前言
C对于内存管理的要求很高如果不及时释放对象内存就可能会发生内存泄露或野指针等情况鉴于这种情况C11提出了智能指针的概念。
一、智能指针是什么
智能指针可以将指针封装为一个栈对象当不需要使用时会在析构函数中释放掉申请的内存所有的智能指针类均包含于头文件 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的对象是否被释放。多应用于事件对象的声明中。
二、示例
#includeiostream
#include memory
using namespace std;void test1()
{//1unique_ptrint p1(new int(1));cout *p1 endl;//2unique_ptrint p2;p2.reset(new int(2));cout *p2 endl;//3make_unique方法是C14开发的unique_ptrint p3 make_uniqueint(3);cout *p3 endl;
}void test2()
{//1shared_ptrint p1(new int(1));cout *p1 endl;//use_count方法用于获取当前资源的引用计数cout use count: p1.use_count() endl;//2shared_ptrint p2;p2.reset(new int(2));cout *p2 endl;//3shared_ptrint p3;p3 make_sharedint(3);cout *p3 endl;//4,可以拷贝和赋值p1的资源shared_ptrint p4(p1);cout *p4 endl;//use_count方法用于获取当前资源的引用计数cout use count: p4.use_count() endl;shared_ptrint p5 p1;cout *p5 endl;//use_count方法用于获取当前资源的引用计数cout use count: p5.use_count() endl;
}void test3()
{//创建一个shared_ptr指针shared_ptrint p1(new int(1));cout *p1 endl;//将shared_ptr指针拷贝给weak_ptr指针weak_ptrint p2(p1);cout use count: p1.use_count() endl;//赋值weak_ptrint p3 p1;cout use count: p1.use_count() endl;
}int main()
{/*test1();*//*test2();*/test3();system(pause);return 0;
}总结
使用智能指针需要注意其使用场合。声明不需共享的对象使用unique_ptr需要共享则使用shared_ptr需要的时候用不需要的时候不用可以使用weak_ptr。