跳至主要內容

std::enable_shared_from_this有什么意义?进来告诉你

muzzik大约 1 分钟笔记编程语言C++智能指针

之前我一直不知道 std::enable_shared_from_this 有什么意义,官方的解答是传递自身的智能指针,但我也一直没用到,都是以第三者的身份管理和传递其他类型的智能
但是,直到我看到了一篇知乎的帖子,上面是这么说的:

需求: 在类的内部需要自身的 shared_ptr 而不是 this 裸指针
场景: 在类中发起一个异步操作, callback 回来要保证发起操作的对象仍然有效.

但是我自己测试了一下,对象销毁后再调用对象成员函数发现用 std::enable_shared_from_this 获取指针的时候就会抛出异常。起初觉得并没有什么用,但我转念一想,抛出异常。那就直接捕获异常呗,这样就可以第一时间捕获异常并处理。这样就可以知道我们的对象是否有效了(用 this 的情况下存在可能不抛出异常的情况)。也就知道在异步过程中调用的对象有效性!

struct A : public std::enable_shared_from_this<A> {
	~A() {
		std::cout << "析构" << std::endl;
	}
	void func() {
		try {
			try {
				auto self = shared_from_this();
				std::cout << self.use_count() << std::endl;
			}
			catch (...) {
				throw 1;
			}
			// 其他代码块, 可以抛出其他类型的异常,便于检查错误信息
		}
		catch (int type) {
			if (type == 1) {
				std::cout << "参数无效" << std::endl;
			}
		}
		catch (std::exception e) {
			std::cout << e.what() << std::endl;
		}
	}
};

int main() {
	{
		std::shared_ptr<A> a;
		a = std::make_shared<A>();
		{
			std::thread temp([&] {
				Sleep(1000);
				a->func();
				}
			);
			temp.detach();
		}
		std::cout << a.use_count() << std::endl;
	}
	while (true) {}
}

学会记得点个赞哦

📣 觉得很赞?分享给你的朋友吧!