2011-01-22 18 views
5

Estoy buscando una manera de salir rápidamente de C++ que ha asignado muchas estructuras en memoria usando clases C++. El programa finaliza correctamente, pero después del "retorno" final en el programa, todos los autodestructores entran en acción. El problema es que el programa ha asignado aproximadamente 15 GB de memoria a través de muchas estructuras de clase C++, y este proceso de autodestrucción toma aproximadamente 1 hora más para completar a medida que recorre todas las estructuras, aunque no me importan los resultados. El programa solo tardó 1 hora en completar la tarea hasta este momento. Me gustaría simplemente regresar al sistema operativo y dejar que haga su eliminación de asignación de proceso mayorista normal, lo cual es muy rápido. He estado haciendo esto matando manualmente el proceso durante la etapa de limpieza, pero estoy buscando una mejor solución de programación.Salida exitosa rápida de C++ con muchos objetos asignados

Me gustaría devolver un éxito al sistema operativo, pero no me importa mantener el contenido de la memoria. El programa realiza una gran cantidad de asignación/desasignación dinámica durante el procesamiento normal, por lo que no se trata de una simple gestión de pila.

¿Alguna opinión?

+6

Simplemente no puede tomar una hora si no está haciendo nada en destructor. Debe haber algo que lo está bloqueando. ¿Has intentado perfilarlo? – Naveen

Respuesta

1

Si los 15 GB de memoria se asignan a un número razonablemente pequeño de clases, puede anular la eliminación del operador para esas clases. Simplemente pase la llamada al borrado estándar, pero configure un indicador global que, si está configurado, hará que la llamada elimine un no-op. O bien, si la lógica de su programa es tal que estos objetos no se eliminan en el curso normal de construcción de sus estructuras de datos, simplemente podría ignorar la eliminación en todos los casos para estas clases.

1

Como dice Naveen, esto no puede ser una cuestión de desasignación de memoria. He escrito simulaciones de redes neuronales con algoritmos evolutivos que asignaban y liberaban mucha memoria en fragmentos pequeños y grandes, y esto nunca fue un problema importante.

4

En el estándar C++ solo tiene abortar(), pero tiene el fallo de devolución del proceso en el sistema operativo.

En muchas plataformas (Unix, MS Windows) puede usar _exit() para salir del programa sin ejecutar la limpieza y los destructores.

+0

_exit() no dice nada acerca de los destructores ya que es la función POSIX (que no dice nada sobre C++). Actualmente no llama a ningún destructor en la plataforma que tengo, pero no está garantizado por la documentación. –

+0

Es por eso que dije que esto funciona en plataformas específicas. Pero como se discutió en http://stackoverflow.com/q/4769229/585729 ese debería ser el caso en cualquier plataforma donde exista. – JoergB

1

Si tiene un compilador C99, puede usar la función _Exit para finalizar inmediatamente sin tener que llamar a los destructores de objetos globales ni a ninguna función registrada con atexit; ya sea que los datos del archivo en búfer no escrito estén o no enchufables, que los flujos abiertos estén cerrados o que los archivos temporales sean eliminados está definido por la implementación (C99 §7.20.4.4).

Si está en Windows, también puede usar ExitProcess para lograr el mismo efecto.

Pero, como han dicho otros, sus destructores no deberían tardar una hora en ejecutarse a menos que esté haciendo una buena cantidad de E/S (escribir archivos de registro, etc.). Recomiendo encarecidamente que perfile su programa para ver dónde se gasta el tiempo.

1

Las posibles estrategias dependen de la cantidad de objetos directamente visibles en main a través de los cuales se accede a los 15 GB de datos y si estos son de local a principal o asignados estáticamente.

Si todo acceso a la 15 GB de datos es a través de objetos locales en main, entonces puede simplemente reemplazar la return 0; al final de main con exit(0);.
exit finalizará su aplicación y activará la limpieza de variables asignadas estáticamente, pero no de variables locales.

Si se accede a los datos a través de un puñado de variables asignadas estáticamente, puede convertirlos en punteros (o referencias) a memoria asignada dinámicamente y filtrarla deliberadamente.

2

C++ 0x std::quick_exit es lo que está buscando si su compilador ya lo admite (g ++ - 4.4.5 lo hace).

Cuestiones relacionadas