7

DatumObjective-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参照として渡す) 方法はありますが、ブロックが完了する前に共有ポインターの割り当てが解除されるのを防ぐ方法はありますか?

4

3 に答える 3

0

次のような方法で所有権を譲渡します。std::unique_ptr

void work(std::unique_ptr<Datum> datum) {
    dispatch_async(dispatch_get_main_queue(), ^{
        // Work with datum.
    });
}

std::unique_ptr<Datum> the_datum(new Datum());
work(std::move(the_datum));
于 2013-09-18T16:22:58.267 に答える