我有以下代码,其中在Objective-C函数work
中使用了一个C++Datum
类的对象:
void work(const Datum &datum) {
dispatch_async(dispatch_get_main_queue(), ^{
// Work with datum.
});
}
这段代码是使用实际上是 boost::shared_ptr<Datum>
实例的情况下调用的。
boost::shared_ptr<Datum> the_datum(new Datum());
work(*the_datum);
在这种情况下,
the_datum
实例可能会在work
内部的块运行之前被释放(调用dispatch_async
在稍后执行异步操作datum
;调用和函数work
立即返回)。这显然会导致灾难。一个解决方案可能是不传递对
work
的引用,而是传递boost::shared_ptr<Datum>
。但是,在某些情况下,可能更喜欢使用引用,请参见例如此线程。有没有办法保持work
接口的方式(即将datum
作为引用传递),但仍然防止共享指针在块完成之前被释放?
intrusive_ptr
而是手动分配和释放内存?至少这样可以处理在执行分发块时智能指针可能在其他位置的情况。 - user8472