Tengo un programa que implementa varios algoritmos de búsqueda heurística y varios dominios, diseñados para evaluar experimentalmente los diversos algoritmos. El programa está escrito en C++, construido utilizando la cadena de herramientas GNU, y se ejecuta en un sistema Ubuntu de 64 bits. Cuando ejecuto mis experimentos, uso el comando ulimit
de bash para limitar la cantidad de memoria virtual que el proceso puede usar, de modo que mi sistema de prueba no comience a intercambiarse.¿Por qué mi programa ocasionalmente segfault cuando falta memoria en lugar de tirar std :: bad_alloc?
Ciertas combinaciones de algoritmo/instancia de prueba alcanzan el límite de memoria que he definido. La mayoría de las veces, el programa arroja una excepción std :: bad_alloc, que es impresa por el controlador predeterminado, en cuyo punto finaliza el programa. Ocasionalmente, en lugar de que esto suceda, el programa simplemente segfaults.
¿Por qué mi programa ocasionalmente segfault cuando falta la memoria, en lugar de informar un std :: bad_alloc no administrado y la terminación?
Segfault puede ser causado no solo porque tocas el límite de memoria – Andrey
Estoy muy consciente. En los casos en que he visto una segfault, el proceso ha estado usando cantidades de memoria cercanas al límite que he especificado. Estoy bastante seguro de que los segmentos que vi no se debieron a errores en mi código. –
¿Ha considerado una ejecución simple en GDB (bueno, algunos de ellos) para ver qué parte del código seg-fault? – Shiroko