国内建设地铁的公司网站nodejs网站开发实例
两种方法的主要区别在于对象的生命周期管理以及捕获方式的不同。以下是对两种方法的详细对比:
第一种:捕获 shared_from_this() 的方法
 
event.subscribe([self = shared_from_this()]() {std::cout << "Event triggered, object is alive." << std::endl;self->onEvent();
});
 
特点:
-  
对象生命周期管理:
- 使用 
shared_from_this()捕获当前对象的std::shared_ptr,保证对象在事件回调执行期间不会被销毁。 - 即使外部没有对对象的引用,
self持有一个shared_ptr,延长了对象的生命周期。 - 适用于需要确保对象在事件发生时仍然有效的场景。
 
 - 使用 
 -  
线程安全性:
- 如果事件回调可能在多线程环境中执行,这种方式可以避免悬空指针的风险。
 
 -  
对象有效性保障:
- 通过 
shared_ptr持有,可以避免事件触发时对象已被销毁的问题。 
 - 通过 
 
第二种:捕获 this 指针的方法
 
event.subscribe([this]() { std::cout << "Event triggered, object is alive." << std::endl;this->onEvent(); 
});
 
特点:
-  
生命周期依赖
this:- 直接捕获 
this指针,依赖于调用subscribe时对象的生命周期。 - 如果对象在事件触发之前被销毁,则调用 
onEvent会导致未定义行为(悬空指针)。 
 - 直接捕获 
 -  
效率较高:
- 不需要额外的 
shared_ptr管理,直接捕获this,开销更低。 - 适用于生命周期完全受控、确保对象在事件回调中一定有效的场景。
 
 - 不需要额外的 
 -  
风险:
- 如果对象在事件触发前已经被销毁,就会导致悬空指针错误,因此适合更受控的环境。
 
 
适用场景对比
| 方法 | 优点 | 缺点 | 适用场景 | 
|---|---|---|---|
捕获 shared_from_this() | 确保对象生命周期,安全性高。可用于异步或多线程环境,避免悬空指针。 | 引入了 shared_ptr,增加了一些开销;要求对象继承 std::enable_shared_from_this。 | 异步事件、跨线程回调,或者在事件触发期间需要确保对象存活时。 | 
捕获 this 指针 | 效率高,简单直接,无需 shared_ptr 的额外管理。 | 如果对象生命周期不受控(可能在事件触发前销毁),会导致悬空指针,容易出错。 | 对象生命周期受控的情况下(如事件和对象生命周期严格同步,或者对象销毁前确保事件解绑)。 | 
代码示例
捕获 shared_from_this() 的安全示例:
 
class Event;
class MyObject : public std::enable_shared_from_this<MyObject> {
public:void onEvent() {std::cout << "Event handled by shared_from_this!" << std::endl;}void subscribeToEvent(Event& event) {event.subscribe([self = shared_from_this()]() {std::cout << "Event triggered, object is alive." << std::endl;self->onEvent();});}
};
 
捕获 this 的受控示例:
 
class MyObject {
public:void onEvent() {std::cout << "Event handled by this pointer!" << std::endl;}void subscribeToEvent(Event& event) {event.subscribe([this]() {std::cout << "Event triggered, ensure object is valid." << std::endl;this->onEvent();});}
};
 
总结:
- 如果对象生命周期由 
std::shared_ptr管理,建议使用shared_from_this(),因为它可以确保对象在回调中存活。 - 如果对象生命周期完全受控,且明确保证事件回调执行时对象一定存活,可以选择效率更高的 捕获 
this。 
