这是你的问题,你一个用例你在栈上创建对象,循环结束后自然会被回收,此时那个指针变成空指针,因此UB。
第二个虽然你使用了共享指针,但你错误传递了共享指针的引用,和上面一样,你还是在引用一个栈空间的变量,其完成后被回收,自然变成空指针。由于此时对象引用计数归0,对象被回收。还是UB。
这个错误非常典型,初学者常犯。其是合法的,lambda没有义务检查空指针。
【 在 Algoquant 的大作中提到: 】
:
: 把对象捕获绑定在lambda表达式里,对象已经析构了,在调用lambda时不抛异常,按UB处理,这是大坑啊。
:
: 我发现对这种情况,只能用 enable_share_from_this 来搞,把对象指针shared_ptr<T>托管到队列或者数组里,异步适时再调用该对象的成员函数。 (我的场景:每个算法对象订阅行情,并在收行情数据后调度器按每个股票快照 调用每个算法对象的onMarketDepth(const MarketDepth& md),这里面就涉及每次调度时,算法对象算法是否还存活)
:
#发自zSMTH@CDU.MP
--
FROM 117.23.183.*