Так, проблема з покажчиками. Швидше за все, ви використовуєте той, який не ініціалізований належним чином, але також можливо, що ви заплутаєте управління пам’яттю подвійними безкоштовними або якимись подібними.
Щоб уникнути неініціалізованих покажчиків як локальних змінних, спробуйте оголосити їх якомога пізніше, бажано (а це не завжди можливо), коли вони можуть бути ініціалізовані значущим значенням. Переконайтеся, що вони матимуть значення перед тим, як їх використовувати, вивчивши код. Якщо у вас виникають труднощі з цим, ініціалізуйте їх константою нульового покажчика (зазвичай пишеться як NULL
або 0
) та перевірте.
Щоб уникнути неініціалізованих покажчиків як значень-членів, переконайтесь, що вони правильно ініціалізовані в конструкторі та оброблені належним чином у конструкторах копіювання та операторах присвоєння. Не покладайтесь на init
функцію управління пам’яттю, хоча для іншої ініціалізації можна.
Якщо ваш клас не потребує конструкторів копіювання або операторів присвоєння, ви можете оголосити їх як приватні функції-члени і ніколи не визначати. Це призведе до помилки компілятора, якщо вони явно або неявно використовуються.
Використовуйте розумні вказівники, коли це можливо. Велика перевага тут полягає в тому, що якщо ви будете дотримуватися їх і використовувати їх послідовно, ви зможете повністю уникнути написання, delete
і ніщо не буде подвійно видалено.
Використовуйте рядки C ++ та класи контейнерів, коли це можливо, замість рядків та масивів у стилі C. Подумайте про використання, .at(i)
а не про те [i]
, що це змусить перевірити межі. Перевірте, чи можна встановити ваш компілятор або бібліотеку для перевірки меж [i]
, принаймні в режимі налагодження. Помилки сегментації можуть бути спричинені перевитратами буфера, які записують сміття над цілком хорошими вказівниками.
Виконання цих дій значно зменшить ймовірність помилок сегментації та інших проблем з пам’яттю. Вони, безсумнівно, не зможуть все виправити, і тому вам слід використовувати valgrind час від часу, коли у вас не виникає проблем, і valgrind і gdb, коли у вас є.
g
в контекстіCMake
?