码迷,mamicode.com
首页 > 编程语言 > 详细

浅析C++中的智能指针

时间:2017-05-31 10:35:32      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:析构   产生   执行   span   对象   new   mem   oid   封装   

一. 概述

由于最近比较多的接触到这块的代码,因此有必要做个总结。

众所周知,C/C++中的堆内存分配和释放的方式主要是: malloc/free 以及 new/delete 等,但这些方式对程序员要求较高,一不小心很可能就会导致内存泄漏而不自知。

请看下面的代码:

void func()
{
    T *pt = new T();
    
    ... /* 此处代码省略若干行 */
    
    delete pt;
    pt = NULL;
    return;
}

如果 func 函数能顺利执行到 delete 处当然是最理想的。如果由于某种原因导致函数在中途返回了,或者在还没执行到 delete 语句时发生了异常,那么就悲剧了,为指针pt分配的内存得不到释放,产生了一个经典的内存泄漏。如果 func 函数是一个执行频率较高的函数,那么就尴尬了...

为了消除传统的内存分配方式上存在的隐患,C++提供了一些强大的智能指针模版类,其核心思想就是:把指针封装在一个"智能的"类似于指针的对象里,这个对象拥有这个指针并且能在析构时自动删除这个指针所指的内存

二. auto_ptr类

字面意义上看,auto_ptr 就是自动指针的意思,当分配的内存不需要使用了,它可以自动回收。

废话不多说,先看例子:

void fun2()
{
   T *pt = new T();

   std::auto_ptr apt(pt); // 将分配的堆内存指针交由auto_ptr托管
   
   *apt = 10; // 像正常使用指针一样使用,相当于*pt= 10
   apt->memFunc(); // 相当于 pt->memFunc()
   
   T *pt2 = apt.get(); // 使用get函数可获取它托管的指针

   T *pt3 = apt.release(); // 可调用release函数放弃托管
   
   // 放弃托管意味着又需要自己手动释放内存了
   delete pt3;
   pt3 = NULL;
   return;
}

未完待续...

浅析C++中的智能指针

标签:析构   产生   执行   span   对象   new   mem   oid   封装   

原文地址:http://www.cnblogs.com/Jocent/p/6921923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!