有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了, 交给智能指针自动去做.
posted on 2017-09-07 18:38  tyw66  阅读(140)  评论(0编辑  收藏  举报