Tak, jest problem ze wskazówkami. Bardzo prawdopodobne, że używasz takiego, który nie został poprawnie zainicjowany, ale możliwe jest również, że psujesz zarządzanie pamięcią przez podwójne zwolnienia lub coś takiego.
Aby uniknąć niezainicjowanych wskaźników jako zmiennych lokalnych, spróbuj zadeklarować je tak późno, jak to możliwe, najlepiej (a to nie zawsze jest możliwe), kiedy można je zainicjować znaczącą wartością. Przekonaj się, że będą miały wartość, zanim zostaną użyte, badając kod. Jeśli masz z tym trudności, zainicjuj je jako stałą wskaźnika zerowego (zwykle zapisaną jako NULL
lub 0
) i sprawdź je.
Aby uniknąć niezainicjowanych wskaźników jako wartości składowych, upewnij się, że są one poprawnie zainicjowane w konstruktorze i prawidłowo obsługiwane w konstruktorach kopiujących i operatorach przypisania. Nie polegaj na init
funkcji do zarządzania pamięcią, chociaż możesz do innej inicjalizacji.
Jeśli Twoja klasa nie potrzebuje konstruktorów kopiujących ani operatorów przypisania, możesz zadeklarować je jako prywatne funkcje składowe i nigdy ich nie definiować. Spowoduje to błąd kompilatora, jeśli zostaną użyte jawnie lub niejawnie.
W stosownych przypadkach używaj inteligentnych wskaźników. Dużą zaletą jest to, że jeśli będziesz się ich trzymać i konsekwentnie używać, możesz całkowicie uniknąć pisania delete
i nic nie zostanie podwójnie usunięte.
Jeśli to możliwe, używaj ciągów C ++ i klas kontenerów zamiast ciągów i tablic w stylu C. Rozważ użycie .at(i)
zamiast [i]
, ponieważ wymusi to sprawdzanie granic. Sprawdź, czy Twój kompilator lub bibliotekę można ustawić tak, aby sprawdzał ograniczenia [i]
, przynajmniej w trybie debugowania. Błędy segmentacji mogą być spowodowane przepełnieniem bufora, które zapisuje śmieci po idealnie dobrych wskaźnikach.
Robienie tych rzeczy znacznie zmniejszy prawdopodobieństwo błędów segmentacji i innych problemów z pamięcią. Bez wątpienia nie naprawią wszystkiego i dlatego powinieneś używać valgrind od czasu do czasu, kiedy nie masz problemów, a valgrind i gdb, kiedy to zrobisz.
g
w kontekścieCMake
?