Il comportamento del codice sarà il comportamento previsto. Ora, il problema è che mentre si potrebbe pensare che la programmazione riguardi la scrittura di qualcosa da elaborare per il compilatore, è altrettanto importante scrivere qualcosa che altri programmatori (o voi in futuro) capiranno e saranno in grado di mantenere. Il codice che hai fornito in molti casi sarà equivalente all'uso di puntatori per il compilatore, ma per gli altri programmatori sarà solo una potenziale fonte di errori.
I riferimenti sono intesi come alias di oggetti gestiti altrove, in qualche modo. In generale le persone saranno sorprese quando incontreranno lo delete &ref
e nella maggior parte dei casi i programmatori non si aspetteranno di dover eseguire un delete
sull'indirizzo di un riferimento, quindi è probabile che in futuro qualcuno chiamerà la funzione e dimenticherà di eliminare e avrai una perdita di memoria.
Nella maggior parte dei casi, la memoria può essere gestita meglio mediante l'uso di puntatori intelligenti (se non è possibile utilizzare altri costrutti di alto livello come std::vector
s). Nascondendo il puntatore dietro il riferimento, rendi più difficile l'uso di puntatori intelligenti sul riferimento restituito, e quindi non stai aiutando, ma rendi più difficile per gli utenti lavorare con la tua interfaccia.
Infine, la cosa buona dei riferimenti è che quando li leggi in codice tu rispondi allo allo che la vita dell'oggetto è gestita da qualche altra parte e non devi preoccuparti di ciò. Usando un riferimento invece di un puntatore si sta sostanzialmente tornando alla singola soluzione (in precedenza solo in C puntatori) e improvvisamente si deve prestare particolare attenzione a tutti i riferimenti per capire se la memoria debba essere gestita lì o no, piuttosto che un maggiore sforzo , più tempo per pensare alla gestione della memoria e meno tempo per preoccuparsi del problema che si sta risolvendo - con la tensione in più del codice insolito, le persone si abituano a cercare perdite di memoria con i puntatori e non si aspettano nessuno dei riferimenti.
In poche parole: la memoria trattenuta dal riferimento nasconde all'utente la necessità di gestire la memoria e rende più difficile farlo correttamente.
fonte
2010-07-13 07:33:35
valido? si, accettabile? oh dio no! perché? Perché qualcuno dovrebbe farlo? ho bisogno di sapere! – gnzlbg
@gnzlbg Presumibilmente perché questo "assicura" che il valore di ritorno _cannot_ sia "nullo" (anche se vedi il punto di Billy ONeal sulla sicurezza delle eccezioni). –
Se il vettore deve trovarsi nello heap: utilizzare un puntatore intelligente che gestisce automaticamente la deallocazione. Si noti inoltre che il valore restituito non può essere nullo perché la versione di nuovo che viene utilizzata funziona o getta. In ogni caso, si tratta di una progettazione API molto scadente, il dover deallocare la memoria tramite un riferimento (non proprietario) non è una pratica comune. E poiché in pratica funzionano effettivamente riferimenti null, ti fideresti di chiunque abbia scritto questa API per non restituire un riferimento null? Non lo farei – gnzlbg