Evitare di creare oggetti dinamicamente laddove possibile. I programmatori provenienti da Java e altri linguaggi simili spesso scrivono cose del genere:
string * s = new string("hello world");
quando dovrebbero hanno scritto:
string s = "hello world";
Allo stesso modo, creano collezioni di puntatori quando dovrebbero creare collezioni di valori. Ad esempio, se si dispone di una classe come questa:
class Person {
public:
Person(const string & name) : mName(name) {}
...
private:
string mName;
};
Piuttosto che scrivere codice come:
vector <Person *> vp;
o anche:
vector <shared_ptr <Person> > vp;
invece utilizzare i valori:
vector <Person> vp;
Puoi facilmente aggiungere a tale ettore:
vp.push_back(Person("neil butterworth"));
e tutta la memoria sia per Persona e il vettore è gestito per voi.Naturalmente, se avete bisogno di un insieme di tipi polimorfi, si consiglia di utilizzare puntatori (smart)
fonte
2009-08-20 12:12:24
attento con la nuova opzione == delete. Supponiamo che tu abbia diversi posti in cui la memoria possa essere rilasciata, ciascuno con un controllo per nullo cioè se (p) cancelli p; 'Puoi finire con nuovo == N * cancella dove N è arbitrario. – ezpz
'cancella 0' è un no-op, quindi non dovresti mai controllare se il tuo puntatore è nullo prima di cancellarlo. –
Grazie Peter! Questo è il mio problema numero 1! "if (p) delete p;" dovrebbe essere riscritto come: "delete p; p = 0;" o qualcosa di simile. – Thomi