zoukankan      html  css  js  c++  java
  • 指针的理解

    有P和Q两指针,都指向位置B.

    • 指针P --> B

    • 指针Q --> B

    • 指针P定义了一个指向(即将指针p"控制"内存的一个位置),而delete p切断了这种控制, 结果就是, 这时虽然P还是能访问它自己指向的这个位置B, 但B实际上不受P的控制,所以叫野指针. (具体来说,delete执行了free(),free()告诉系统的数据结构, 将位置B算作系统的空闲自由内存了)
      delete()的作用是释放(归还)内存资源,

    • 然后,假如指针变量P超出了作用域,失效了,那么:

      • 如果之前已经delete了,P指向的那块内存B是自由的 --> OK.
      • 如果之前没有delete,P指向的那块内存B没有人指向它了 --> 内存泄漏
    • 类似的, P失效后, 指针Q还在指向B呢, Q现在是野指针了

    总结起来, 要处理好释放内存删除指针这两种操作,

    • 释放了内存,指针还在 --> 野指针
    • 指针没了,内存还没还 --> 内存泄漏

    为了解决这些问题, 引入了智能指针shared_ptr<>

    • 智能指针P --> B
    • 智能指针Q --> B
    • 现在P和Q是智能指针了, 其内部有个引用计数,每个shared_ptr对象都会记录还有多少个其他的shared_ptr指向("控制了")相同对象. 一旦指针失效,计数发生变化, 这些智能指针对象内的计数都会同步变化, 当计数为0即没有人指向B了时,自动调用B的 delete释放资源.从而避免野指针.
    • 用了智能指针之后不应该出现delete了, 交给智能指针自动去做.
  • 相关阅读:
    redis 数据类型 Hash
    redis有序集合类型sort set
    redis数据类型set
    redis的 list
    redis的key
    centos安装redis
    input聚焦事件
    width(),innerWidth(),outerWidth(),outerWidth(true)
    jq 选择器
    详解CSS中:nth-child的用法_大前端
  • 原文地址:https://www.cnblogs.com/tyw66/p/7491224.html
Copyright © 2011-2022 走看看