Minhas desculpas por postar tanto tempo após a última postagem neste tópico.
Um ponto adicional. Nem todos os programas chegam a saídas elegantes. Falhas e ctrl-Cs, etc. farão com que o programa seja encerrado de maneiras não controladas. Se seu sistema operacional não liberasse seu heap, limpe sua pilha, exclua variáveis estáticas, etc, você eventualmente travaria seu sistema por vazamentos de memória ou coisa pior.
Além disso, o interessante é que trava / quebra no Ubuntu, e eu suspeito que todos os outros sistemas operacionais modernos, têm problemas com recursos "controlados". Sockets, arquivos, dispositivos, etc. podem permanecer "abertos" quando um programa termina / trava. também é uma boa prática fechar qualquer coisa com um "identificador" ou "descritor" como parte de sua limpeza antes da saída normal.
Atualmente, estou desenvolvendo um programa que usa muito soquetes. Quando eu fico preso em um travamento, tenho que ctrl-c para fora dele, assim, encalhando meus soquetes. Eu adicionei um std :: vector para coletar uma lista de todos os sockets abertos e um manipulador de sigaction que captura sigint e sigterm. O manipulador percorre a lista e fecha os soquetes. Estou pensando em fazer uma rotina de limpeza semelhante para usar antes de lançar, que levará ao encerramento prematuro.
Alguém se importa em comentar sobre este design?