Operazioni di I / O asincrono - modo corretto per evitare l'eliminazione dell'oggetto

1

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?

    
posta pawell55555 06.03.2016 - 12:16
fonte

1 risposta

1

Why nobody(?) use this solution

Quando si passa un puntatore condiviso a boost asio, questo verrà cancellato quando asio non ha più I / O in sospeso su di esso, se non ci sono riferimenti condivisi nel codice client.

Passando ad asio un puntatore raw, dovrai assicurarti di tenerlo in memoria fino a quando tutte le operazioni asincrone saranno completate. Se non lo fai, rischi di invalidare il puntatore (nel codice client) mentre asio sta usando quella memoria.

    
risposta data 21.03.2016 - 10:18
fonte

Leggi altre domande sui tag