我有以下代码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作为引用传递),但仍然防止在块完成之前释放共享指针?