Il signor Lidström e io abbiamo litigato :)
L'affermazione del signor Lidström è che un costrutto shared_ptr<Base> p(new Derived);
non richiede che Base abbia un distruttore virtuale:
Armen Tsirunyan : "Davvero? Shared_ptr ripulirà correttamente? Potresti per favore in questo caso dimostrare come questo effetto potrebbe essere implementato?"
Daniel Lidström : " shared_ptr utilizza il proprio distruttore per eliminare l'istanza Concrete. Questo è noto come RAII all'interno della comunità C ++. Il mio consiglio è che impari tutto ciò che puoi su RAII. Renderà il tuo codice C ++ molto più semplice quando lo usi RAII in tutte le situazioni ".
Armen Tsirunyan : "Conosco RAII, e so anche che alla fine il distruttore shared_ptr potrebbe cancellare il px memorizzato quando pn raggiunge 0. Ma se px avesse un puntatore di tipo statico
Base
e un puntatore di tipo dinamico aDerived
, allora a meno che nonBase
abbia un distruttore virtuale, questo risulterà in un comportamento indefinito. Correggimi se sbaglio. "Daniel Lidström : " shared_ptr sa che il tipo statico è Concrete. Lo sa da quando l'ho passato al suo costruttore! Sembra un po 'magico, ma posso assicurarti che è di design ed estremamente carino."
Quindi, giudicaci. Come è possibile (se lo è) implementare shared_ptr senza richiedere alle classi polimorfiche di avere un distruttore virtuale? Grazie in anticipo