1、为了保证不会重复释放内存,auto_ptr的copy构造和copy赋值都是破坏性操作,执行后,导致右操作数的指针为0。这就出现了,copy构造或者copy赋值后,两个对象不相等了。

2、auto_ptr的问题就是,一块内存只能有一个指针指向它,为了解决这个问题,使用share_ptr。

3、share_ptr是如何实现的?

  a、内部有一个指向原始资源的指针。

  b、内部维护一个share_count,记录有多少个指针指向该内存。

  c、析构的时候,share_count>1,将计数减1;share_count==1释放内存。

  d、考虑到每个share_ptr中都有一个自己的share_count,而且还要保证这个数一致,应该这样做:先对原始资源封装,加入share_count,成为带有count的资源,share_count在对它封装,这样就可以只有一个share_count了。

  e、copy构造的时候,lhs的指针指向rhs的资源,share_count加1。

  f、copy赋值的时候,先检查左操作数原来的资源是否可以释放,lhs的指针指向rhs的资源,share_count加1。

share_ptr的更多相关文章

  1. 为了异常安全(swap,share_ptr)——Effecive C++

    互斥锁: 假设我们要在多线程中实现背景图片的控制: class PrettyMenu{ public: -- void changeBackground(std::istream& imgSr ...

  2. 【校招面试 之 C/C++】第26题 C++ 智能指针(二)之 share_ptr

    1.综述 shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std. shared_ptr 是为 ...

  3. 智能指针share_ptr记录

    shared_ptr 是一个共享所有权的智能指针,允许多个指针指向同一个对象.shared_ptr 对象除了包括一个对象的指针,还包括一个引用计数器.当每给对象分配一个share_ptr的时候,引用计 ...

  4. 初识boost之boost::share_ptr用法

    boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr. 这其中,我最喜欢,使用最多的 ...

  5. boost::share_ptr用法

    boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr. 这其中,我最喜欢,使用最多的 ...

  6. C++11智能指针 share_ptr,unique_ptr,weak_ptr用法

    0x01  智能指针简介  所谓智能指针(smart pointer)就是智能/自动化的管理指针所指向的动态资源的释放.它是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动 ...

  7. auto_ptr & share_ptr & unique_ptr

    Using auto_ptr, you don’t need think about the memory deallocation, but there are also many argument ...

  8. c++之boost share_ptr

    转载:https://www.cnblogs.com/welkinwalker/archive/2011/10/20/2218804.html

  9. C++11学习之share_ptr和weak_ptr

    一.shared_ptr学习 1.shared_ptr和weak_ptr 基础概念 shared_ptr与weak_ptr智能指针均是C++ RAII的一种应用,可用于动态资源管理 shared_pt ...

随机推荐

  1. Dfs【P2052】 [NOI2011]道路修建

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...

  2. 【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)

    4148: [AMPPZ2014]Pillars Time Limit: 5 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 100  Solve ...

  3. 可以在GitHub或者码云里 直接搜索 项目 比如 哔哩哔哩

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha Search · 哔哩哔哩 哔哩哔哩 · 搜索 - 码云 还有就是 以前的项目 可以不要 ...

  4. hust 1590 - 方块游戏 数学

    1590 - 方块游戏 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1590 D ...

  5. When to use static method in a java class

    First , please understand its feature : * no need to instantiate a instance, i.e. simply you can jus ...

  6. HDU 4681 String(2013多校8 1006题 DP)

    String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...

  7. Hyper-v: Snapshot merge

    我有一个Hyper-V上的虚拟机, 在使用的过程中我给这个虚拟机创建了多个snapshots. 有一天我把整个的snapshots tree从root删掉了(delete snapshot with ...

  8. JMeter压力测试和性能测试工具

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测 试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件 ...

  9. Error: Finish can only be called once

    Android studio 启动或者新建项目:报错“Error: Finish can only be called once” gradle缓存问题: 默认的额缓存路径在: on windows ...

  10. CRF,没完全看懂

    这篇文章,感觉讲的还比较浅显易懂: http://www.sohu.com/a/207085690_206784