type
status
date
slug
summary
tags
category
icon
password

📝 主要内容

裸指针

非动态申请内存地址,函数运行结束编译器自动释放
动态申请内存地址,函数结束也不会释放
但是也无法访问该内存地址,造成内存泄漏
c++为了追求性能,没有在语言层面上的垃圾回收功能

shared_ptr

共享指针会记录有多少个共享指针指向同一个物体
当数字降为0时,程序会自动释放这个物体
notion image
使用智能指针需要加上
创建一个class
创建三个shared_ptr指向Ball实例
运行结果如下
notion image
可以看到当所有shared_ptr都重置后
原指针指向的Ball就自动释放了

引用计数

创建一个共享指针指向物体,引用计数会计算当前指向该物体的共享指针个数。
当引用计数为0时,程序自动释放这个物体,防止出现内存泄漏

同时使用裸指针

如果仍然需要获得指向物体的裸指针可以使用get()方法
但是当所有共享指针被销毁时,裸指针仍然存在,资源也会释放
应尽量避免裸指针和共享指针混用

unique_ptr

0开销,独占某个资源,不支持复制操作
运行结果如下:
notion image
unique_ptr销毁时资源会自动进行释放

其他用法:

get()reset()用法和shared_ptr一致
可以使用release()和已绑定资源解绑
release()返回资源裸指针
使用release()move()转移控制权

weak_ptr

shared_ptr的伴侣,它是shared_ptr的观察者,对资源的引用为非拥式
没有资源的管理权限,不能控制资源释放
访问资源的时候需要通过shared_ptr
weak_ptr仅用于检查资源是否存在,不用于控制资源

使用场景

环形依赖的情况下,使用shared_ptr可能会造成内存泄漏
notion image
运行程序可以看到控制台什么都没有打印,
说明该对象在程序运行结束时没有被销毁
原因:因为当程序执行到principal->school = university;
下面university中的shared_ptr仍然指向principal
另一个对象同理,他们的引用计数都没有降为0,所以不会自动销毁

使用weak_ptr解决环形依赖问题

只需要将Teacher 类中的 shared_ptr改为 weak_ptr即可
运行程序可以看到两个对象被正常释放
notion image

注意事项

智能指针是C++11的新功能
需要在编译器加入C++11命令
notion image

📎 参考链接