Sim, há um problema com os ponteiros. Muito provavelmente você está usando um que não foi inicializado corretamente, mas também é possível que esteja bagunçando o gerenciamento de memória com liberações duplas ou algo parecido.
Para evitar ponteiros não inicializados como variáveis locais, tente declará-los o mais tarde possível, de preferência (e isso nem sempre é possível) quando eles podem ser inicializados com um valor significativo. Convença-se de que eles terão um valor antes de serem usados, examinando o código. Se você tiver dificuldade com isso, inicialize-as a uma constante ponteiro nulo (geralmente escrita como NULL
ou0
) e verifique-os.
Para evitar ponteiros não inicializados como valores de membro, certifique-se de que eles sejam inicializados corretamente no construtor e manipulados corretamente nos construtores de cópia e operadores de atribuição. Não confie em uma init
função para gerenciamento de memória, embora você possa fazer outra inicialização.
Se sua classe não precisa de construtores de cópia ou operadores de atribuição, você pode declará-los como funções-membro privadas e nunca defini-los. Isso causará um erro do compilador se eles forem explícita ou implicitamente usados.
Use ponteiros inteligentes quando aplicável. A grande vantagem aqui é que, se você segui-los e usá-los consistentemente, pode evitar completamente a escrita delete
e nada será excluído duas vezes.
Use strings C ++ e classes de contêiner sempre que possível, em vez de strings e arrays no estilo C. Considere usar em .at(i)
vez de [i]
, porque isso forçará a verificação dos limites. Veja se seu compilador ou biblioteca pode ser configurado para verificar os limites [i]
, pelo menos no modo de depuração. Falhas de segmentação podem ser causadas por saturações de buffer que gravam lixo sobre ponteiros perfeitamente bons.
Fazer essas coisas reduzirá consideravelmente a probabilidade de falhas de segmentação e outros problemas de memória. Eles sem dúvida falharão em consertar tudo, e é por isso que você deve usar valgrind de vez em quando quando não tiver problemas, e valgrind e gdb quando tiver.
g
no contexto deCMake
?