有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了, 交给智能指针自动去做.