Nel libro Stroustrup (. Il C++ linguaggio di programmazione 4a ed, §17.5.1, pag 508) ho trovato il seguente esempio di un costruttore di copia per un semplice Matrix
classe:Perdita di risorse nell'esempio Stroustrup con std :: uninitialized_copy?
template < class T >
Matrix:: Matrix(const Matrix& m) // copy constructor
: dim{ m.dim },
elem{ new T[ m.size() ] }
{
uninitialized_copy(m.elem, m.elem+m.size(), elem); // copy elements
}
(dove elem
è il puntatore all'array di elementi T, dichiarato come T* elem;
).
Ho due domande su questo costruttore di copia:
perché il metodo di default prima costruire una serie di elementi
m.size()
, solo per sovrascrivere nel corpo con la chiamatauninitialized_copy
?con l'inizializzazione
elem{ new T[ m.size() ] }
, il costruttore di T è chiamatom.size()
volte. Tuttavia, l'algoritmouninitialized_copy
nel corpo non chiama il distruttore T prima di costruire il nuovo array nella stessa area. Si tratta di una potenziale perdita di risorse? (Nota: non una perdita di memoria, una perdita di risorse! Ad esempio, se T acquisisce un lock o un descrittore di file nel Ctor e lo rilascia nel Dtor).
Grazie
Questo non è vero- se il costruttore di copie fallisce, il distruttore non verrà chiamato. Ciò porta ad un problema di perdita di memoria/eccezione di sicurezza più problematico se il costruttore di copie * non * fallisce, assumendo che 'elem' sia un' T * '. – Puppy
@Puppy hai completamente ragione; questo è il motivo per cui non scrivo mai classi di contenitori. – ecatmur
Se 'elem' fosse un' unique_ptr ', sarebbe perfettamente sicuro. –
Puppy