Comencé un proyecto en C++. La administración de memoria en este lenguaje es nueva para mí.C++ Técnicas/prácticas de administración de memoria
Solía crear objetos con new()
y luego pasaba punteros y, aunque funcionaba, me costaba depurar y la gente me veía raro cuando veían el código. Estoy muy orgulloso del hecho de que no haya fugas o segfault (una vez corregido), pero realmente fue un gran esfuerzo.
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);
Tengo una nueva estrategia para esta próxima versión del proyecto. Hasta ahora, lo que estoy haciendo es crear objetos con new()
y asignarles un número de identificación entero único. Luego almaceno el objeto en una tabla hash usando la ID como clave. Ahora los elementos se almacenan y pasan por el número entero de identificación y cuando necesita desviarlo, va a la tabla hash y le devuelve thing *
o NULL
. Por lo tanto, ya no experimento errores de puntero, pero la velocidad del código se reduce un poco.
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
}
}
Ahora estoy especie de familiarizarse con los principios básicos de la programación, pero siendo un aficionado autodidacta No estoy familiarizado con las prácticas y herramientas de la industria. Lo que básicamente estoy pidiendo, son pautas sobre la administración de la memoria:
1) ¿Qué estoy haciendo bien o mal?
2) ¿Hay algún paquete o biblioteca que pueda usar que me ayude?
3) ¿Cuáles son las prácticas estándar de la industria?
4) Básicamente, ¿qué debo buscar en Google o comprar para kindle, etc.?
Hoy usualmente uso Python, maneja muchas cosas de "back-end" para mí, pero necesito C o C++ (supongo que estoy usando plain c más las librerías de stdC++, no estoy muy seguro de dónde la superposición entre los lenguajes es - solo sé que g ++ lo compila bien) para este proyecto en particular por razones de velocidad/rendimiento: aunque sospecho que algún genio matemático podría proporcionar soluciones algorítmicas que acelerarían su velocidad, aunque esa es una pregunta aparte.
Comience mirando 'shared_ptr'. –
La primera herramienta que utilizaría es valgrind: http://valgrind.org/docs/manual/QuickStart.html – Anycorn
Buscar RAII. Esto es un poco loco. –