Uso delle operazioni di I / O asincrono da boost :: asio Spesso ho bisogno di puntatori condivisi (e enable_shared_from_this e shared_from_this in callbacks) per evitare di cancellare oggetti troppo presto. Penso che potrebbe essere fatto mantenendo unique_ptr o solo object (ownership) in classe (come membro)
Ad esempio: solo il metodo foo usa il mittente.
1st (soluzione popolare):
class C {
public:
void foo
{
std::shared_ptr<Sender> sender = std::make_shared<Sender>();
sender->send();
// class Sender use async_write
// inheritance: enable_shared_from_this
// callback in async operation created with argument shared_from_this
}
};
Perché nessuno (?) usa questa soluzione:
class D {
public:
void foo
{
sender.reset(new Sender);
sender->send();
}
private:
std::unique_ptr<Sender> sender;
};
So che il mittente non verrà cancellato all'inizio. Non ho shared_ptrs. Penso che sia bene evitarli perché se la callback nella classe Sender utilizza anche operazioni asincrone ho bisogno di altri puntatori condivisi, ecc. Penso che la classe D sia più amichevole da leggere. Ma mi chiedo se è un buon stile ... e vedo sempre una soluzione con shared_ptrs nella rete. So che il mittente non viene cancellato dopo aver fatto il suo lavoro. Ma è un problema?