今天继续学习12.1节时,从练习12.17中发现了一个问题。

首先摘录教材中的原话——一个unique_ptr“拥有”它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。

也就是说,不可能同时存在两个unique_ptr指针指向同一个对象的情况。

先给出练习12.17中的练习代码,然后观察现象:

int main(void)
{//练习12.17 int ix = 1024, *pi = &ix, *pi2 = new int(2048); //pi和pi2为内置指针typedef unique_ptr<int> IntP;  IntP p2(pi2); //正确的,用内置指针初始化一个unique_ptrIntP p5(p2.get()); //正确的,用p2返回的内置指针初始化创建一个unique_ptrcout << *p5 << " ";cout << *p2 << endl;*pi2 = 42;cout << *p5 << " ";cout << *p2 << endl;p5.reset(); //释放p5所指向的对象cout << *p2 << endl; //产生未定义的结果

  return 0;
}

运行得到的结果为:

可以看出unique_ptr指针p2和p5指向了同一个对象!而这个本质原因是利用了内置指针对这两个unique_ptr指针进行了初始化。在网上查找了一些资料发现没有解答,目前我初步的猜想是unique_ptr并没有shared_ptr那样的计数机制,当用同一个内置指针给unique_ptr初始化时,它并不能知道是否有其他unique_ptr指针指向这个对象,所以导致出现了多个unique_ptr指针指向同一个对象!所以利用内置指针对智能指针(无论是shared_ptr还是unique_ptr)进行初始化都是不安全的。

转载于:https://www.cnblogs.com/ChenZhongzhou/p/5356231.html

12.1 动态内存与智能指针(2)相关推荐

  1. 【C++ Primer 第5版 笔记】第12章 动态内存与智能指针

    转载:http://blog.csdn.net/wwh578867817/article/details/41866315 第 12 章 动态内存 与 智能指针 静态内存 用来保存:(1)局部stat ...

  2. 2.5w字长文爆肝 C++动态内存与智能指针一篇搞懂!太顶了!!!

    动态内存与智能指针 1.动态内存与智能指针 2.shared_ptr类 2.1.make_shared函数 2.2.shared_ptr的拷贝和赋值 2.3.shared_ptr自动销毁所管理的对象 ...

  3. C++ Primer 5th笔记(chap 12 动态内存)智能指针概述

    1. 对象的生存期 内存类型 定义 分配和销毁时机 全局对象 程序启动时分配,程序结束时销毁 静态内存 局部static对象类static数据成员 第一次使用时分配,程序结束时销毁 栈内存 定义在函数 ...

  4. C++知识点34——动态内存与智能指针

    一.动态内存 动态内存所在的位置在堆区,由程序员手动分配并手动释放,而不像栈内存由系统分配和自动释放 C++通过new运算符为对象在堆上分配内存空间并返回该对象的地址,并用delete运算符销毁对象并 ...

  5. C++相关:动态内存和智能指针

    前言 在C++中,动态内存的管理是通过运算符new和delete来完成的.但使用动态内存很容易出现问题,因为确保在正确的时间释放内存是及其困难的.有时候我们会忘记内存的的释放,这种情况下就会产生内存泄 ...

  6. 【Smart_Point】动态内存与智能指针

    动态内存 动态内存使用的三种原因 程序不知道自己需要多少对象 程序不知道所需对象的准确类型 程序需要在多个对线之间共享数据 文章目录 动态内存 动态内存使用的三种原因 实例1: Exercise 12 ...

  7. 【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)

    文章目录 Cpp读入结构性数组 文本查询程序 文本查询程序本版1 Cpp读入结构性数组 #include<sstream> #include<iostream> #includ ...

  8. 【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )

    文章目录 I . 智能指针 引入 II . 智能指针 简介 III . 智能指针 简单示例 I . 智能指针 引入 1 . 示例前提 : 定义一个 Student 类 , 之后将该类对象作为智能指针指 ...

  9. 道高一尺 魔高一丈 内存泄漏智能指针

    一.什么是内存泄漏 内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 内存泄漏主要分为两类: 1. 堆内存泄漏 堆 ...

最新文章

  1. All in one: pentest under metasploit
  2. Redis专题-底层数据结构与使用场景
  3. 从SOURCE_BUFFER单元开始存放了20个字母A, 编程将这20个字母A的字符 串向下移10个单元.
  4. [Leedcode][JAVA][第739题][每日温度][暴力][单调栈]
  5. 60、二叉搜索树的第k个结点
  6. php导入excel源码,利用PHPExcel类库,实现PHP导出导入Excel表格Excel文件!
  7. Storm集群安装Version1.0.1
  8. 任晶磊:如何看待程序员在 GitHub 发起抗议互联网公司实行 996 工作制网站?
  9. html左右分隔可调整,CSS实现可拖拽分割面板
  10. 过程定义伪指令proc和宏命令伪指令macro
  11. 高通 MSM 8916与MSM8926芯片的区别
  12. 教程篇(7.0) 03. FortiClient EMS配置和管理 ❀ FortiClient EMS ❀ Fortinet 网络安全专家 NSE 5
  13. setBounds()和setSize的区别
  14. 程序员的职场潜意识Top10
  15. webview在android8.0,解决Android8.0系统应用打开webView报错
  16. 浅谈因子分析(Factor Analysis)
  17. react按钮倒计时效果(发送验证码按钮)
  18. PS 学习笔记 15-橡皮擦工具组
  19. jquery 弹出对话框
  20. 力学专业做cae需要学c语言吗,CAE工程师是需要掌握力学知识到何种程度_

热门文章

  1. 股灾情形下搞了个满堂红,我也是醉了
  2. selenium+python自动化,数据驱动实例
  3. TC SRM 665 DIV2 B LuckyCycle 暴力
  4. AAC Explicit or Implicit SBR PS issue
  5. Deep3DBox论文解读
  6. 自动驾驶算法-滤波器系列(八)——IMM交互多模型介绍
  7. 【SLAM笔记】三维刚体运动
  8. yolov3前向传播(一)-- darknet53网络解析与实现
  9. 队列的基础知识及实现方法
  10. 怎么彻底移除虚拟机_Parallels Desktop虚拟机怎么完全卸载? PD虚拟机完全卸载方法...