auto_ptr
1、
int *pi = new int(1024);
delete pi; // 释放pi指向的int对象占用的内存空间
pi = 0; // 将pi设置为0,不指向任何东西,为Null
注意:删除0值的指针是安全的,但是没有任何意义。对于上面的情况,先释放内存,再置为Null。顺序不能颠倒,如果颠倒了,会导致内存泄漏。
2、在Stack上分配的内存,用完后,系统会自动释放,调用析构方法。在Heap上,通过new分配内存,必须使用delete,手动释放内存,如果忘记,会导致内存泄漏。如果重复释放内存,会破坏自由存储区,导致分配在上面的其他对象受到破坏。(Stack记录程序的执行过程,Heap存放数据)
3、为了解决上面的问题,使用auto_ptr
4、auto_ptr是一个模版类,对一个类型的指针进行封装,把delete操作放在析构方法中,由于析构方法总是被调用,就保证了内存不会泄露。
5、auto_ptr是一个模版类,为了让auto_ptr使用起来像一个指针,重载*与->操作符。
6、用a对象copy构造b对象的时候,要把a的指针设为0,为什么?
如果,不把a的指针设为0,a,b都会在析构方法中进行delete,导致重复释放。
7、把a对象copy赋值给b对象的时候,首先要把b对象的指针delete,然后把a的指针设为0,为什么?
b的指针指向了a的指针,要对b原来的指针释放掉,不然内存泄漏。
8、copy构造是破坏性操作,lhs的指针指向rhs的资源,rhs的指针设为null。为了避免重复释放。
9、copy赋值是破坏性操作,首先对lhs进行delete,避免内存泄漏。其次,lhs的指针指向rhs的资源,rhs的指针设为null。为了避免重复释放。
auto_ptr的更多相关文章
- C++ 之 auto_ptr and shared_ptr
1.auto_ptr 这个所谓的只能指针有点鸡肋! 没有引用计数,而且还有一个所有权转移的情况! 当所有权转移后,以前的auto_ptr将会成为null 2.shared_ptr 增加了引用计数,没 ...
- auto_ptr源码剖析
/* * Copyright (c) 1997-1999 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, ...
- C++11 auto_ptr 的问题
auto_ptr作为最早的智能指针,可以实现以RAII手法管理堆区对象,但它设计的本意只是简单的利用C++对于栈区对象的自动析构管理堆区对象, 并不像shared_ptr那样包含引用计数,可以在每次拷 ...
- c++ auto_ptr智能指针
c++ auto_ptr智能指针 该类型在头文件memory中,在程序的开通通过 #include<memory> 导入,接下来讲解该智能指针的作用和使用. 使用方法: auto_ptr& ...
- [3] 智能指针std::auto_ptr
[1]std::auto_ptr 对于编译器来说,智能指针实质是一个栈对象,而并非指针类型. 智能指针通过构造函数获取堆内存的管理所有权,而在其生命期结束时,再通过析构函数释放由它所管理的堆内存. 所 ...
- std::auto_ptr
auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII,在构造的 ...
- auto_ptr浅析(转载)
转载自http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html auto_ptr是C++标准库中(<utility>)为 ...
- c++ auto_ptr 智能指针
c++使用智能指针应该保证无论在何种情况下,只要自己被摧毁,就一定连带释放其所有资源,而由于智能型指针本身就是区域变量, 所以无论是正常退出,还是异常退出,只要函数退出,它就一定销毁 常数型auto_ ...
- 【STL】-auto_ptr的用法
初始化: #include<memory> //auto_ptr header void f() { auto_ptr<classA> ptr(new classA); } 拷 ...
- auto_ptr的使用原则
auto_ptr是c++标准库中的一种严格所有权型的智能指针,实现在backward/auto_ptr.h文件中 pro: 1.做临时变量时,不需要手动去释放资源 void f() { ClassA ...
随机推荐
- BASE64Decoder BASE64Encoder jar包问题
操作 对项目右击--->build path--->configure build path---> 选中默认jre OK,操作完毕, import sun.misc.BASE64D ...
- Unity 2D游戏开发教程之摄像头追踪功能
Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...
- Angular Material Starter App
介绍 Material Design反映了Google基于Android 5.0 Lollipop操作系统的原生应用UI开发理念,而AngularJS还发起了一个Angular Material ...
- [POI2012]Squarks
[POI2012]Squarks 题目大意: 设有\(n\)个互不相同的正整数\(\{X_1,X_2,...,X_n\}\),任取两个\(X_i,X_j(i\ne j)\),能算出\(X_i+X_j\ ...
- poj 3261 求可重叠的k次最长重复子串
题意:求可重叠的k次最长重复子串的长度 链接:点我 和poj1743差不多 #include<cstdio> #include<iostream> #include<al ...
- USACO 2017 FEB Gold visitfj 最短路
题意 有一幅n*n的方格图,n <= 100,每个点上有一个值.从(1,1)出发,走到(n,n),只能走四联通.每走一步花费t,每走三步需要花费走完三步后到达格子的值.求最小花费的值. 拆点,d ...
- 使用牛顿迭代法和二分法求解一个数的平方根(python语言实现)
#牛顿迭代法 def sqrt1(x): y = 1.0 while abs(y * y - x) > 1e-6: y = (y + x/y)/2 return y #使用二分法 def sqr ...
- li 标签中放a 标签,文字垂直居中
<ul style="float:left"><li class="lili"> <a href="Left.aspx? ...
- shell 快速移动,快捷操作
ctr+h 往后删除一字符 ctr+d 往前删除一字符 ctr+b 光标往前 ctr+f 往后ctr+u 删除到最前 ctr+K删除到最后ctr+a 光标到最前 ctr+e 光标到最后ctr+p 往上 ...
- Handling Errors and Exceptions
http://delphi.about.com/od/objectpascalide/a/errorexception.htm Unfortunately, building applications ...