简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

1.前言
本篇目的:C++之std::enable_shared_from_this实例
std::enable_shared_from_this 是一个模板类,在 C++ 标准库的 <memory> 头文件中定义。它提供了一种方便的方式来在类中获取指向自身的 std::shared_ptr。
std::enable_shared_from_this 主要用于解决在一个对象需要将自身的所有权共享给多个 std::shared_ptr 的情况。它的作用可以总结如下:
-
获取共享指针:通过继承
std::enable_shared_from_this,可以在类内部使用shared_from_this()成员函数来获取指向当前对象的std::shared_ptr。 -
避免裸指针问题:使用
std::enable_shared_from_this可以解决裸指针(raw pointer)转换为std::shared_ptr的问题。如果一个对象直接从裸指针创建而不是通过std::shared_ptr,那么调用shared_from_this()将导致 undefined behavior。而继承std::enable_shared_from_this可以确保对象只能通过std::shared_ptr创建,并且可以正确地共享所有权。 -
安全地共享所有权:当多个
std::shared_ptr指向同一对象时,它们共享对该对象的所有权。这种方式可以确保在所有std::shared_ptr都析构之后,对象才会被正确地销毁。如果不通过std::enable_shared_from_this使用shared_from_this(),在获取指向自身的std::shared_ptr时可能会导致引用计数错误或对象的早期销毁。
请注意,为了正确使用 std::enable_shared_from_this,必须遵循以下几点:
- 类必须继承自
std::enable_shared_from_this。 - 对象的生命周期必须由
std::shared_ptr管理,不能使用裸指针。 - 获取
shared_from_this()的调用必须发生在对象被std::shared_ptr管理之后。
std::enable_shared_from_this 提供了一种安全和方便的方式来获取指向自身的 std::shared_ptr,有效地解决了共享所有权的问题。
2.实例
#include <iostream>
#include <memory>
class Test : public std::enable_shared_from_this<Test> {
public:
std::shared_ptr<Test> getShared() {
return shared_from_this();
}
};
int main() {
std::shared_ptr<Test> objPtr = std::make_shared<Test>();
std::shared_ptr<Test> sharedPtr = objPtr->getShared();
//使用objPtr.get()和sharedPtr.get()来获取指针的原始地址.
printf("objPtr = %p, sharedPtr = %p\n",objPtr.get(),sharedPtr.get());
if(objPtr == sharedPtr){
printf("objPtr == objPtr \n");
}
return 0;
}















![VRTK4⭐三.VRTK4 : 射线传送模块 [包含API传送]](https://img-blog.csdnimg.cn/ecc7a1c4a2f649c389bd8478229d03fe.gif#pic_center)



