Uso del puntatore raw di std :: vector

6

Attualmente sto mantenendo un codice che fa un uso liberale dei puntatori grezzi dove std::vector sarebbe un'opzione migliore. Peggio ancora, questi puntatori non sono sempre gestiti correttamente (quando viene eseguito con Intel Inspector, viene visualizzato il messaggio di avviso "Avviso: vengono riportati solo i primi 100.000 problemi di memoria"). In quanto tale, ho lentamente modificato tutte le istanze dei puntatori non elaborati in std::vector . Tuttavia, ci sono diverse funzioni che si aspettano un puntatore raw come input e invece di modificare tutte le dichiarazioni e le definizioni delle funzioni, ho semplicemente acceduto al puntatore raw associato a std::vector . I.e, codice che era:

double *doubleVec = new double[size];
//code that puts values in doubleVec
someFunc(doubleVec);

diventa

std::vector<double> doubleVec(size);
//code that puts values in doubleVec
someFunc(&doubleVec.front());

Questa è considerata una cattiva pratica? Da un lato, sto usando una classe wrapper e poi ignoro completamente il wrapper nelle chiamate di funzione, il che non ha molto senso. D'altra parte, il punto della classe wrapper è di occuparsi della gestione della memoria, e poiché le chiamate di funzione non interferiscono con la memoria in alcun modo, sta facendo il suo lavoro.

    
posta wolfPack88 06.01.2015 - 16:16
fonte

2 risposte

7

Ciò di cui dovresti preoccuparti è la proprietà dei dati e quanto a lungo i puntatori devono / saranno validi.

L'utilizzo di std :: vector ti consentirà di essere più rilassato sulla validità, ma dovresti comunque fare attenzione poiché una riallocazione invaliderà il puntatore.

Tuttavia, il codice C ++ è pieno di &vector[0] per ottenere il puntatore al primo elemento, quindi è molto accettato di afferrare un puntatore raw per riempire i dati usando una libreria di terze parti.

    
risposta data 06.01.2015 - 16:27
fonte
7

Ora c'è un metodo vector.data() che benedice esplicitamente la pratica

    
risposta data 06.01.2015 - 16:20
fonte

Leggi altre domande sui tag