我有以下代码Datum
在 Objective-C 函数中使用类的 C++ 对象work
:
void work(const Datum &datum) {
dispatch_async(dispatch_get_main_queue(), ^{
// Work with datum.
});
}
这段代码是用一个实际上是 a 的实例调用的boost::shared_ptr<Datum>
,即
boost::shared_ptr<Datum> the_datum(new Datum());
work(*the_datum);
在这种情况下,实例可能the_datum
在块内部运行之前被释放work
(对dispatch_async
执行异步操作datum
的调用稍后执行;调用和因此函数work
立即返回)。这显然会导致灾难。
一种解决方案可能是不传递对 的引用work
,而是传递 a boost::shared_ptr<Datum>
。但是可能存在首选引用的情况,请参见例如this thread。有什么办法可以保留的接口work
(即datum
作为引用传递),但仍然防止在块完成之前释放共享指针?