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的更多相关文章

  1. C++ 之 auto_ptr and shared_ptr

    1.auto_ptr 这个所谓的只能指针有点鸡肋!  没有引用计数,而且还有一个所有权转移的情况! 当所有权转移后,以前的auto_ptr将会成为null 2.shared_ptr 增加了引用计数,没 ...

  2. auto_ptr源码剖析

    /* * Copyright (c) 1997-1999 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, ...

  3. C++11 auto_ptr 的问题

    auto_ptr作为最早的智能指针,可以实现以RAII手法管理堆区对象,但它设计的本意只是简单的利用C++对于栈区对象的自动析构管理堆区对象, 并不像shared_ptr那样包含引用计数,可以在每次拷 ...

  4. c++ auto_ptr智能指针

    c++ auto_ptr智能指针 该类型在头文件memory中,在程序的开通通过 #include<memory> 导入,接下来讲解该智能指针的作用和使用. 使用方法: auto_ptr& ...

  5. [3] 智能指针std::auto_ptr

    [1]std::auto_ptr 对于编译器来说,智能指针实质是一个栈对象,而并非指针类型. 智能指针通过构造函数获取堆内存的管理所有权,而在其生命期结束时,再通过析构函数释放由它所管理的堆内存. 所 ...

  6. std::auto_ptr

    auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII,在构造的 ...

  7. auto_ptr浅析(转载)

    转载自http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html auto_ptr是C++标准库中(<utility>)为 ...

  8. c++ auto_ptr 智能指针

    c++使用智能指针应该保证无论在何种情况下,只要自己被摧毁,就一定连带释放其所有资源,而由于智能型指针本身就是区域变量, 所以无论是正常退出,还是异常退出,只要函数退出,它就一定销毁 常数型auto_ ...

  9. 【STL】-auto_ptr的用法

    初始化: #include<memory> //auto_ptr header void f() { auto_ptr<classA> ptr(new classA); } 拷 ...

  10. auto_ptr的使用原则

    auto_ptr是c++标准库中的一种严格所有权型的智能指针,实现在backward/auto_ptr.h文件中 pro: 1.做临时变量时,不需要手动去释放资源 void f() { ClassA ...

随机推荐

  1. 通过因特网连接Beaglebone Black

    通过因特网连接Beaglebone Black 通过网络连接,可以使你方便地从各种地方以及各种不同的电脑访问到Beaglebone Black.这种连接Beaglebone Black方式通常使用5V ...

  2. jQuery before 和 after

    A.after(B) ==== B.insertAfter(A) B 放在 A 的后面A.before(B) ==== B.insertBefore(A) B 放在 A 的前面 A.append(B) ...

  3. Linux中的mysql操作(2)

    1.终端启动MySQL:/etc/init.d/mysql start: 2.登录MySQL:mysql –u root -p (用root账户登录),然后输入密码: 3.查看所有的数据库名字:sho ...

  4. 安卓 自定义ViewGroup

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 指定的 布局参数 在计算时候方法 中 计算 所有 子视图的 宽高, 然后根据这些 计算出 ...

  5. Linux下C语言多文件的编译以及makefile的应用

    1.关于编译和链接 一般来说,无论是C.C++,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile ...

  6. PHP 笔记——操作MySQL数据库

    1. 连接MySQL服务器 ​ mysqli_connect :此函数是该函数的别名: mysqli::__construct() mysqli mysqli_connect ( [string se ...

  7. luoguP3600 随机数生成器 期望概率DP + DP优化

    这篇题解更像对他人题解的吐槽和补充? 考虑答案 $E[X] = \sum\limits_{i = 1}^{x} i P(X = i)$ $P(X = i)$不好求................(其实 ...

  8. 【8.19校内测试】【背包】【卡特兰数】【数位dp】

    早上随便搞搞t1t3就开始划水了,t2一看就是组合数学看着肚子疼...结果t1t3都a了??感天动地. 从小到大排序,从前到后枚举i,表示i是整个背包中不选的物品中代价最小的那个,即i不选,1到i-1 ...

  9. bzoj 1098

    对于关系,看其是否是“等价关系”,即满足:自反,传递,对称. 如果是可以用并查集来连接等价类. 这道题是求原图补集的联通快个数,考虑原图度最少的点(由鸽巢原理,最多为2*e/n个). 先将未与其连边的 ...

  10. C++继承引入的隐藏与重写

    在区分隐藏和重写之前,先来理一理关于继承的东西... [继承] 继承是面向对象复用的重要手段,是类型之间的关系建模.通过继承一个类,共享公有的东西,实现各自本质不同的东西.简单的说,继承就是指一个对象 ...