Datum
Objective-C 関数内で class の C++ オブジェクトを使用する次のコードがありますwork
。
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
すぐに戻ります)。これは明らかに災害につながります。
1 つの解決策は、 への参照を渡すのではなく、 を渡すことwork
ですboost::shared_ptr<Datum>
。ただし、参照が優先される場合もあります。たとえば、このスレッドを参照してください。のインターフェイスを保持するwork
(つまり、datum
参照として渡す) 方法はありますが、ブロックが完了する前に共有ポインターの割り当てが解除されるのを防ぐ方法はありますか?