c++标准库智能指针:shared_ptr

本文详细介绍了C++中的智能指针,包括shared_ptr的特点和使用,如自动管理内存、引用计数等。强调了避免普通指针与智能指针混用的重要性,并展示了如何通过reset()和make_shared()正确操作智能指针。同时提到了自定义删除器的概念,以确保对象在适当的时候被释放。
摘要由CSDN通过智能技术生成

《c++ primer》12.1章节

1、智能指针是为了更加安全(防止内存还被引用着就被释放)和方便(不必自己手动释放内存)地使用动态内存(静态内存和栈内存中的对象由编译器创建和销毁,动态内存由程序创建和销毁)而存在。

2、shared_ptr的特点是允许多个指针指向同一个对象。

3、智能指针也是模板,因此要指定类型:

    std::shared_ptr<int> p;

4、shared_ptr默认值是nullptr。

5、unique()内存是否被唯一指针引用。

6、use_count()获取引用计数。当引用计数变为0时,shared_ptr会自动释放它管理的对象。

7、不能将普通指针转换成智能指针。

以下写法是错误的:

    std::shared_ptr<int> p1 = new int(1024);

new运算符返回的是一个int类型的指针,这里试图将int*普通指针隐式转换成shared_ptr。

正确的写法:

    std::shared_ptr<int> p1(new int(1024));

或:

    std::shared_ptr<int> p1 = std::make_shared<int>(1024);

8、重设shared_ptr,若再没有其他shared_ptr指向对象则对象释放:reset(),这会让shared_ptr的值设为空。

#define debug qDebug()<<
int main(int argc, char *argv[])
{
    std::shared_ptr<int> p1 = std::make_shared<int>(1024);
    std::shared_ptr<int> p2 = p1;
    debug (p1 == nullptr) << &*p1 << &*p2;
    p1.reset();
    debug (p1 == nullptr);
    debug p2.use_count() << *p2 << &*p2;
}

reset()还可以将一个新的指针赋给shared_ptr,如果原来指向的对象不为空,则被释放:

    std::shared_ptr<int> p1 = std::make_shared<int>(1024);
    p1.reset(new int(666));

9、get()返回智能指针管理的对象的普通指针,get()的存在是为了向不能使用智能指针的代码传递普通指针。

    std::shared_ptr<int> p1 = std::make_shared<int>(1024);
    int * p2 = p1.get();

10、不要混用普通指针和智能指针,例:

void debugValue(std::shared_ptr<int> sp)
{
    qDebug()<<*sp;
}

#define debug qDebug()<<
int main(int argc, char *argv[])
{
    int * p2 = new int(666);
    debugValue(std::shared_ptr<int>(p2));
    debug *p2;
}

这里传参数的时候创建了一个临时的shared_ptr,引用了p2的地址,当debugValue()执行完了以后会清除该临时变量,作为唯一引用p2地址的shared_ptr被清除时,会释放其引用的对象,p2指向的对象就被释放了。

正确的做法是只使用智能指针:

void debugValue(std::shared_ptr<int> sp)
{
    qDebug()<<*sp;
}

#define debug qDebug()<<
int main(int argc, char *argv[])
{
    std::shared_ptr<int> p1 = std::make_shared<int>(1024);
    debugValue(p1);
    if(p1 == nullptr)
        debug "p1为空";
    else
        debug *p1;
}

11、自定义删除器。 shared_ptr在清空所指向的对象时默认调用的是对象的析构函数,如果没有析构函数的对象可以在shared_ptr创建时指定自定义的删除器,如源码所示:

void deleteFun(int *p)
{
    qDebug()<<"delete Run";
    delete p;
}

#define debug qDebug()<<
int main(int argc, char *argv[])
{
    std::shared_ptr<int> p1(new int(1024),deleteFun);
}

这样清除对象时就会调用指定的函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值