Sto lavorando su una base di codice C++ legacy molto grande che deve rimanere senza nome. Essendo una base di codice legacy, passa i puntatori grezzi in giro dappertutto. Ma stiamo gradualmente cercando di modernizzarlo e quindi ci sono anche alcuni modelli di puntatori intelligenti. Questi puntatori intelligenti (a differenza, per esempio, di scope_ptr di Boost) hanno una conversione implicita al puntatore raw, in modo che sia possibile passare uno di essi in una routine che accetta un puntatore raw senza dover scrivere .get()
. Un grosso svantaggio di questo è che si può anche utilizzarne accidentalmente uno in un'istruzione delete
, e quindi si ha un doppio bug libero, che può essere un vero problema da rintracciare.Modello di "puntatore intelligente" C++ che si converte automaticamente in puntatore nuda ma non può essere eliminato in modo esplicito
C'è un modo per modificare il modello in modo che abbia ancora la conversione implicita al puntatore raw, ma causa un errore di compilazione se utilizzato in un'istruzione delete? Come questo:
#include <my_scoped_ptr>
struct A {};
extern void f(A*);
struct B
{
scoped_ptr<A> a;
B();
~B();
};
B::B()
: a(new A)
{
f(a); // this should compile
}
B::~B()
{
delete a; // this should NOT compile
}
Lo faresti, vero? – GManNickG
g ++ è indeciso, 4.4 non si compila, 4.5 lo fa. Se cambio il tipo della seconda conversione in un tipo di puntatore a funzione, g ++ lo fa correttamente e si ferma su 'delete a'. –
@Luther grazie, aggiunto :) –