【C++学习笔记】详解C++中的三种智能指针

本文详细介绍了C++中的三种智能指针:std::auto_ptr、boost::scoped_ptr和boost::shared_ptr。智能指针用于自动管理内存,避免内存泄漏和程序崩溃。std::auto_ptr存在所有权转移问题和使用限制;boost::scoped_ptr独享所有权,不支持赋值和拷贝;boost::shared_ptr通过引用计数实现多个智能指针共享所有权,但可能引发循环引用问题,此时可借助boost::weak_ptr解决。
摘要由CSDN通过智能技术生成
一、简介
  • 由于 C++ 语言没有垃圾回收机制,程序员每次 new出来的内存都要手动 delete。程序员忘记 delete,有可能就会造成内存泄漏,程序崩溃等严重的后果。用智能指针便可以有效缓解这类问题,本文主要讲解常见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::weak_ptr。
二、具体使用

1、总括

  • 对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。所有智能指针都重载了“operator->”操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用“.”操作符。
    访问智能指针包含的裸指针则可以用 get() 函数。由于智能指针是一个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指针是否为空,需要这样判断:if (my_smart_object.get())。
    智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。

2、std::auto_ptr

  • std::auto_ptr 属于 STL,当然在 namespace std 中,包含头文件 #include 便可以使用。std::auto_ptr 能够方便的管理单个堆内存对象。

我们从代码开始分析:

void TestAutoPtr() 
{

std::auto_ptr<Simple> my_memory(new Simple(1));   // 创建对象,输出:Simple:1

if (my_memory.get())
 {                            // 判断智能指针是否为空

    my_memory->PrintSomething();                    // 使用 operator-> 调用智能指针对象中的函数

    my_memory.get()->info_extend = "Addition";      // 使用 get() 返回裸指针,然后给内部对象赋值

    my_memory->PrintSomething();                    // 再次打印,表明上述赋值成功

    (*my_memory).info_extend += " other";           // 使用 operator* 返回智能指针内部对象,然后用“.”调用智能指针对象中的函数

    my_memory->PrintSomething();                    // 再次打印,表明上述赋值成功

      }

}              
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值