智能指针auto_ptr、内存泄漏解决

原创 2016年08月29日 20:02:14

在C++11中,已经不使用auto_ptr,而用 unique_ptr进行替代,不过二者原理都差不多。头文件:memory

智能指针:实质上是一个类,在创建智能指针的时候,本质上是在栈上创建了一个对象,而析构函数总是会在出栈时被调用,清理会自动进行。unique_ptr(auto_ptr)通过在栈上构建一个对象a,对象a中动态分配内存指针p,所有对指针p的操作都转为对对象a的操作。而在a的析构函数中会自动释放p的空间,而该析构函数是编译器自动调用的,无需程序员操心。
unique_ptr(auto_ptr):都是唯一指针,且只能智能指针都要直接初始化,但unique_ptr(auto_ptr)不能像shared_ptr那样共享,对于指针不能复制,只能转移其控制权,利用release()和reset()函数,转移之后,原来的指针就失效了。

内存泄漏定义
1、new了一个空间,但没有delete;
2、动态内存不存在作用域的问题,但保存其地址的指针变量是受作用域影响的,指针一般是局部变量,在函数内部new以后没有释放,
那么该区域的内存将始终不能为其他数据所使用,而指向该内存的指针是个局部变量,当定义该指针的函数结束并且返回时,指针也就消失了,我们就再也找不到该块中的内存区域,指向该内存区域的指针自动消失了。 计算机就再也找不到该区域的内存了,就好像是丢失了这块内存一样,这种情况被称之为内存泄漏。

优点:
解决内存泄漏问题,智能指针在出栈时,都会自动释放指针,而不用像使用普通指针那样要考虑因为异常等原因没有delete掉。

使用注意:
1、应绝对避免把auto_ptr放到容器中,(unique_ptr)auto_ptr拷贝赋值时是所有权转移,而在容器中可能会产生临时对象拷贝赋值,临时对象获得所有权之后就析构了释放了对象。并且很难避免STL内部对容器中的元素实现赋值,这样便会使容器中多个元素被置位NULL。

vector<auto_ptr<MyClass>>m_example//绝不能这样做

2、auto_ptr的析构函数调用的是delete不是delete [],所以不能使用智能指针数组。

3、避免unique_ptr(auto_ptr)之间的赋值。

4、当将unique_ptr(auto_ptr)作为函数参数时,最好声明为const auto_ptr&引用,避免所有权转移,当函数返回值可以简单的传值。

版权声明:本文为博主原创文章,未经博主允许不得转载。

智能指针share_ptr使用过程中需要注意的几点

智能指针在boost中很早就有了,在tr1上也很早,但是没怎么用,后来0x标准出来之后,智能指针变成了标准库,所以现在用起来就不区分boost和std了。 主要说下share_ptr的几个注意点,待...
  • yusiguyuan
  • yusiguyuan
  • 2014年11月05日 21:19
  • 4725

必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱

十二.小心使用智能指针。         在前面几节已经很详细了介绍了智能指针适用方式。看起来,似乎智能指针很强大,能够很方便很安全的管理我们的资源。然而其实不然,如果不恰当的使用智能指针有时候会在很...
  • y1196645376
  • y1196645376
  • 2016年11月03日 19:42
  • 1331

C++ auto_ptr智能指针的用法

C++ auto_ptr智能指针的用法
  • MONKEY_D_MENG
  • MONKEY_D_MENG
  • 2010年09月23日 00:45
  • 29118

浅析C++智能指针

在C语言中我们用malloc和free来申请和释放内存。而在C++语言中,我们常用new与delete来申请和释放内存。 那么无论是C还是C++我们都很容易在动态内存的管理上出现问题, 1.忘记de...
  • u012999985
  • u012999985
  • 2016年01月10日 18:02
  • 623

智能指针的死穴 -- 循环引用

C++最新标准C++11中已将基于引用计数的智能指针share_prt收入囊中,智能指针的使用门槛越来越低,不需要使用boost库,我们也能轻松享受智能指针给我们带来的方便。 智能指针,正如它的名字...
  • jfkidear
  • jfkidear
  • 2013年06月05日 21:59
  • 5991

unique_ptr的使用和陷阱

unique_ptr的使用 分配内存 与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,并且由于unique_ptr不可拷...
  • qq_33266987
  • qq_33266987
  • 2017年12月12日 17:42
  • 410

浅谈智能指针auto_ptr/shared_ptr/unique_ptr

一.智能指针1.引入我们通常使用类似new申请一块空间,交由一个指针指向,假如说最后忘记delete,将会造成内存泄露。而智能指针的出现,就是对这种问题的解决方式,智能指针类似指针,却可以用于管理动态...
  • derkampf
  • derkampf
  • 2017年05月23日 19:24
  • 684

c++11智能指针解析——揭开底层面纱,完整理解智能指针

昨天跟同事小小的研究了下关于不同平台下,起因是遇到了一个坑,vs上没有问题,在安卓上却崩溃了。找了半天后发现是c++字节补齐问题,期间包括使用#pragma pack(1)来限定字节对齐方式等各种条件...
  • zy19940906
  • zy19940906
  • 2016年01月07日 17:00
  • 11368

C++11 智能指针——(C++98)auto_ptr

auto_ptr是严格的拥有权类智能指针,使用时注意以下几点 绝对不应使用一个原始指针来初始化2个或2个以上的auto_ptr对象 auto_ptr对象通过赋值或构造转移拥有权,一旦...
  • wssjlrw
  • wssjlrw
  • 2016年03月05日 13:39
  • 564

C++智能指针解决内存泄漏问题

在C++开发中,好多程序员经常会被内存泄漏问题困扰,使用智能指针就可以减少内存泄漏。智能指针可以自动删除分配的内存。智能指针和普通指针类似,只是不需要手动释放指针,而是通过智能指针自己管理内存的释放。...
  • fanyun_01
  • fanyun_01
  • 2017年11月26日 21:56
  • 168
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:智能指针auto_ptr、内存泄漏解决
举报原因:
原因补充:

(最多只允许输入30个字)