C++总结笔记(十二)—— 智能指针

本文详细介绍了C++11中的智能指针概念,包括unique_ptr、shared_ptr和weak_ptr的工作原理、示例及使用场景。学习如何避免内存泄漏,理解不同智能指针在内存管理中的作用。


前言

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()
{
    //1
    unique_ptr<int> p1(new int(1));
    cout << *p1 << endl;
    //2
    unique_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()
{
    //1
    shared_ptr<int> p1(new int(1));
    cout << *p1 << endl;
    //use_count方法用于获取当前资源的引用计数
    cout << "use count: " << p1.use_count() << endl;
    //2
    shared_ptr<int> p2;
    p2.reset(new int(2));
    cout << *p2 << endl;
    //3
    shared_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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值