2013-04-11 18 views
9

Ho bisogno di creare puntatori di istanze di una classe e il programma non sa al momento della compilazione quanti puntatori creerò. Per la cancellazione, stavo considerando di memorizzare i puntatori in un vettore e quindi eliminarli uno per uno. L'uso di puntatori intelligenti sarebbe un modo più pulito per andare? E se uno non vuole usare i puntatori intelligenti, questo uso del vettore dovrebbe essere considerato pulito?Eliminazione del vettore di puntatori

codice minimo:

#include <vector> 
using namespace std; 

class Foo { 
public: 
    Foo(); 
}; 
Foo::Foo(){} 
void createFooVector(int nb, std::vector<Foo*> &v){ 
    for(int i=0;i<nb;i++){ 
     Foo* f = new Foo(); 
     v.push_back(f); 
    } 
} 
int main(int argc, char *argv[]){ 
    std::vector<Foo*> v; 
    createFooVector(5,v); 
    while (!v.empty()){ 
     Foo* f = v.back(); 
     v.pop_back(); 
     delete f; 
    } 
} 
+2

Hai davvero bisogno di un contenitore di puntatori? Non puoi memorizzare gli oggetti 'Foo' come valori (' std :: vector ')? Inoltre, non sarebbe più chiaro se 'createFooVector' restituisse un nuovo vettore invece di modificare quello dato come argomento? –

+0

@LucTouraille Uso il puntatore per questo motivo: http://stackoverflow.com/questions/15471193/vector-of-virtual-class-are-pointers-the-clean-way-to-go ... questo non potrebbe essere visto nel codice che mostro qui, però, ho cercato di mantenerlo minimo – Vince

risposta

3

vorrei suggerire sia utilizzando un boost::pointer_vector, un std::vector<std::unique_ptr<Foo>>, o stendere la propria classe Foo direttore che detiene una vector<Foo*> e si prende cura di delezioni nel costruttore (si dovrebbe vedere questo come la soluzione "esperto", e unico tentativo se comprendi pienamente la sicurezza delle eccezioni). Non si desidera eseguire la cancellazione manualmente, che può facilmente portare a errori.

+0

Non consiglierei comunque la soluzione manager; è probabile che l'OP non lo renderà abbastanza sicuro per quanto riguarda le eccezioni ... –

+0

@MatthieuM. Verissimo. Ho aggiunto un avvertimento a riguardo. – juanchopanza

1

Il codice va bene. Tuttavia, l'uso di puntatori intelligenti dovrebbe essere la scelta preferita (meno codice da scrivere e molte meno opportunità per i bug di memoria).

1

L'uso di puntatori intelligenti sarebbe un modo più semplice per andare?

Sì.

E se uno non vuole usare i puntatori intelligenti, questo uso del vettore può essere considerato pulito?

non ho idee, perché qualcuno non vuole puntatori intelligenti uso in C++, se non è compiti ... Ma, secondo me, è meglio usare qualcosa di simile boost::pointer_containers in questo caso.

1

Se non si utilizzano classi derivate da e è relativamente economico per copiare il costrutto, è sufficiente utilizzare vector<Foo>.

Se il compilatore supporta la semantica di spostamento, non dovrebbe esserci un problema.

+1

Se è costoso costruire poco le cose, penso che steste pensando di essere costosi da * copiare *. Con la semantica del movimento, però, potrebbe non essere un grosso problema ... e se il peggio dovesse peggiorare, si può usare il nuovo membro 'emplace_back'. –

+0

@Matthieu Sì, spostare la semantica cambia tutto. Per chiarire cosa intendevo, per inserire un valore in un vettore, devi costruirlo e quindi la copia vettoriale ne costruisce un'altra. Intendevo indicare la necessità di prendere in considerazione la costruzione dei valori in generale. Aggiornerò per dire 'copia costrutto'. –

Problemi correlati