C++智能指针shared_ptr的初步了解

1、智能指针的作用

C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。

从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。

智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来解决。

 

2、std::shared_ptr

头文件:

#include <memory>

 

3、创建方法

std::shared_ptr<类型名>

 

4、初始化方法

一:创建对象初始化

Student *s1 = new Student();
std::shared_ptr<Student> s2(s1);

二:使用make_shared初始化

std::shared_ptr<Student> sp3 = std::make_shared<Student>();

 

三:

std::shared_ptr<Student> sp4(new Student());

 

5、use_count()函数

返回引用计数的个数

std::shared_ptr<Student> sp(new Student());
sp.use_count();

 

6、unique()

返回是否独占所有权(use_count为1)

std::shared_ptr<Student> sp(new Student());
sp.unique();

 

7、swap() 交换对象

std::shared_ptr<Student> sp1(new Student());
std::shared_ptr<Student> sp2(new Student());
s1.swap(sp2);

8、reset()

放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少

std::shared_ptr<Student> sp1(new Student());
sp1.reset();

9、get()

返回内部对象,未找到返回空

sp.get();

Demo: 

#include <iostream>
#include <memory>

using namespace std;

class Student
{
public:
    Student(){};
    Student(int age){m_age = age;}
    ~Student(){ };
public:
    void print_age(){cout<<m_age<<endl;}
    
private:
    int m_age;
};
int main()
{
    Student *sp1= new Student(20);
    std::shared_ptr<Student> sp2(sp1);

    std::shared_ptr<Student> sp3 = std::make_shared<Student>(20);
    //sp3->print_age();

    std::shared_ptr<Student> sp4(new Student(10));
    //sp4->print_age();

    cout<<sp4.use_count()<<endl;

    std::shared_ptr<Student> sp5=sp4;
    std::shared_ptr<Student> sp6=sp4;
    cout<<sp4.use_count()<<endl;

    sp4.reset();
    cout<<sp4.use_count()<<endl;
    return 0;
}

 

结果:

g++ -o shared_test shared_test.cpp -std=c++0x

./shared_test 
1
3
0

参考:

https://blog.csdn.net/u011068702/article/details/83692838

https://www.cnblogs.com/diysoul/p/5930361.html

https://en.cppreference.com/w/cpp/memory/shared_ptr

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值