Sí, hay un problema con los punteros. Es muy probable que esté utilizando uno que no se haya inicializado correctamente, pero también es posible que esté arruinando la gestión de su memoria con dobles liberaciones o algo así.
Para evitar punteros no inicializados como variables locales, intente declararlos lo más tarde posible, preferiblemente (y esto no siempre es posible) cuando puedan inicializarse con un valor significativo. Convénzase de que tendrán un valor antes de que se utilicen, examinando el código. Si tiene dificultades con eso, inicialícelos a una constante de puntero nulo (generalmente escrito como NULL
o 0
) y verifíquelos.
Para evitar punteros no inicializados como valores de miembros, asegúrese de que estén inicializados correctamente en el constructor y se manejen correctamente en los constructores de copia y los operadores de asignación. No confíe en una init
función para la gestión de la memoria, aunque puede hacerlo para otras inicializaciones.
Si su clase no necesita constructores de copia u operadores de asignación, puede declararlos como funciones miembro privadas y nunca definirlos. Eso provocará un error del compilador si se utilizan explícita o implícitamente.
Utilice punteros inteligentes cuando corresponda. La gran ventaja aquí es que, si se adhiere a ellos y los usa de manera consistente, puede evitar completamente la escritura delete
y nada se eliminará dos veces.
Utilice cadenas de C ++ y clases de contenedor siempre que sea posible, en lugar de cadenas y matrices de estilo C. Considere usar en .at(i)
lugar de [i]
, porque eso forzará la verificación de límites. Vea si su compilador o biblioteca se puede configurar para verificar límites [i]
, al menos en modo de depuración. Las fallas de segmentación pueden ser causadas por saturaciones de búfer que escriben basura sobre punteros perfectamente buenos.
Hacer esas cosas reducirá considerablemente la probabilidad de fallas de segmentación y otros problemas de memoria. Sin duda fallarán en arreglarlo todo, y es por eso que debería usar valgrind de vez en cuando cuando no tenga problemas, y valgrind y gdb cuando los tenga.
g
en el contexto deCMake
?