Ho avviato un progetto in C++. La gestione della memoria in questa lingua è nuova per me.C++ Gestione della memoria Tecniche/pratiche
Mi sono abituato a creare oggetti con new()
e quindi a passare i puntatori e mentre funzionava, era un problema eseguire il debug e le persone mi guardavano in modo strano quando vedevano il codice. Sono abbastanza orgoglioso del fatto che non ha perdite o segfault (una volta risolto), ma è stato davvero un grande sforzo.
list <struct Connection *> users;
struct Connection * accept_connection (const char *name) {
struct Connection * new_node = new Connection();
new_node->_data = ... // whatever, set it up here
return new_node;
}
struct Connection * new_user = accept_connection (const char *name);
users.append (new_user);
Quindi ho una nuova strategia per questa prossima versione del progetto. Finora quello che sto facendo è creare oggetti con new()
e assegnare loro un numero di ID intero univoco. Quindi immagazzino l'oggetto in una tabella con hash usando l'ID come chiave. Ora gli articoli sono memorizzati e passati in giro per il numero ID intero e quando è necessario de-referenziare, si passa alla tabella hash e si restituisce o thing *
o NULL
. Quindi non ho più errori di puntatore, ma la velocità del codice è leggermente ridotta.
typedef unsigned long ID_Number;
// create a user and return the ID
ID_Number create_user() {
ID_Number new_id = assign_unique_id();
struct User * node = new User();
node->_id = new_id;
node->_data = ... // whatever, set it up here
add_to_users_dict (new_id, node);
return new_id;
}
list <ID_Number> users;
for_each (users.begin(), users.end(), process_user);
void process_user (ID_Number i) {
struct User * u_ptr = lookup_user_dict (i);
if (u_ptr == NULL) {
// not found in dict
// somehow this guy was deleted
} else {
// we can do stuff with this guy
}
}
Ora sono una sorta di familiarità con i principi fondamentali della programmazione ma essendo un hobbista autodidatta Non ho familiarità con le pratiche e gli strumenti del settore. Quello che sto fondamentalmente chiedendo sono le linee guida sulla gestione della memoria:
1) Che cosa sto facendo giusto o sbagliato?
2) Esistono pacchetti o librerie che posso utilizzare per aiutarmi?
3) Quali sono le pratiche standard del settore?
4) Fondamentalmente cosa dovrei googling o comprare per kindle ecc?
Oggi io di solito uso Python, lo fa gestire un sacco di "back end" roba per me, ma ho bisogno di C o C++ (suppongo che sto utilizzando pianura C più i STDC++ librerie, io non sono abbastanza sicuro dove la sovrapposizione tra i linguaggi è - so solo che g ++ lo compila bene) per questo particolare progetto per motivi di velocità/prestazioni: sebbene sospetti che qualche genio matematico possa fornire correzioni algoritmiche che ne velocizzerebbero la fine, anche se questa è una domanda separata.
Inizia guardando 'shared_ptr'. –
Il primo strumento che utilizzerei è valgrind: http://valgrind.org/docs/manual/QuickStart.html – Anycorn
Cerca RAII. Questo è un po 'folle. –