type
status
date
slug
summary
tags
category
icon
password
📝 主要内容
裸指针
非动态申请内存地址,函数运行结束编译器自动释放
动态申请内存地址,函数结束也不会释放
但是也无法访问该内存地址,造成内存泄漏
c++为了追求性能,没有在语言层面上的垃圾回收功能
shared_ptr
共享指针会记录有多少个共享指针指向同一个物体
当数字降为0时,程序会自动释放这个物体
使用智能指针需要加上
创建一个class
创建三个
shared_ptr
指向Ball
实例运行结果如下
可以看到当所有
shared_ptr
都重置后原指针指向的
Ball
就自动释放了引用计数
创建一个共享指针指向物体,引用计数会计算当前指向该物体的共享指针个数。
当引用计数为0时,程序自动释放这个物体,防止出现内存泄漏
同时使用裸指针
如果仍然需要获得指向物体的裸指针可以使用
get()
方法但是当所有共享指针被销毁时,裸指针仍然存在,资源也会释放
应尽量避免裸指针和共享指针混用
unique_ptr
0开销,独占某个资源,不支持复制操作
运行结果如下:
unique_ptr销毁时资源会自动进行释放
其他用法:
get()
和reset()
用法和shared_ptr
一致可以使用
release()
和已绑定资源解绑release()
返回资源裸指针使用
release()
和move()
转移控制权weak_ptr
shared_ptr的伴侣,它是shared_ptr的观察者,对资源的引用为非拥式
没有资源的管理权限,不能控制资源释放
访问资源的时候需要通过shared_ptr
weak_ptr仅用于检查资源是否存在,不用于控制资源
使用场景
环形依赖的情况下,使用shared_ptr可能会造成内存泄漏
运行程序可以看到控制台什么都没有打印,
说明该对象在程序运行结束时没有被销毁
原因:因为当程序执行到
principal->school = university;
时下面
university
中的shared_ptr
仍然指向principal
另一个对象同理,他们的引用计数都没有降为0,所以不会自动销毁
使用weak_ptr解决环形依赖问题
只需要将
Teacher
类中的 shared_ptr
改为 weak_ptr
即可运行程序可以看到两个对象被正常释放
注意事项
智能指针是C++11的新功能
需要在编译器加入C++11命令