Sono arrivato a C++ 11 da uno sfondo Objective-C, e una cosa che sto cercando di fare i conti è la diversa semantica di cattura di C++ 11 lambdas vs Objective-C "blocks". (Vedere here per un confronto).Uso di C++ 11 lambda in modo asincrono, in modo sicuro
In Objective-C, come C++, il puntatore self
/this
viene catturato in modo implicito se si fa riferimento a una variabile membro. Ma poiché tutti gli oggetti in Objective-C sono effettivamente "puntatori condivise", per usare la terminologia C++, si può fare questo:
doSomethingAsynchronously(^{
someMember_ = 42;
});
... e avrete la garanzia che l'oggetto di cui si sta accedendo membro sarà vivo quando il blocco verrà eseguito. Non devi pensarci. L'equivalente in C++ sembra essere qualcosa di simile:
// I'm assuming here that `this` derives from std::enable_shared_from_this and
// is already owned by some shared_ptr.
auto strongThis = shared_from_this();
doSomethingAsynchronously([strongThis, this] {
someMember_ = 42; // safe, as the lambda holds a reference to this
// via shared_ptr.
});
Qui, è necessario ricordare per catturare l'shared_ptr oltre al puntatore this. C'è un modo meno incline agli errori di raggiungere questo?
* "Non devi pensarci." * Comincia a pensarci. Porta a un design migliore. – Pubby
@Pubby Ma il fatto è che è senza sforzo usare i blocchi che li rende così utili e così pervasivi da eseguire compiti asincroni one-shot nel mondo Obj-C. Se avessero la semantica C++ 11, e dovevi chiedervi "questo oggetto sarà vivo, questo oggetto sarà vivo, questo oggetto sarà vivo ..." ogni volta, penso che molte persone sarebbero tentate di dì "fanculo, lo farò in modo sincrono". –
Creare un puntatore condiviso da 'this' non garantisce che esisterà ancora, a meno che l'oggetto stesso non sia già di proprietà di un puntatore condiviso e lo si copi. La creazione di un nuovo puntatore condiviso (con 'new shared_ptr (this)' o 'make_shared (this)') servirà solo per ottenere una doppia eliminazione, a meno che la memoria non sia trapelata altrimenti. Quindi, nel tuo caso, in che modo "questo" viene cancellato se non si crea un puntatore condiviso a questo punto? –
Agentlien