Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 73
#1

Как устранять ошибки памяти? - C++

30.06.2014, 17:07. Просмотров 485. Ответов 10
Метки нет (Все метки)

День добрый! Есть программа с которой очень много проблем, проблемы заключаются в том, что программа падает с ошибкой, но иногда запускается. Ошибки , если я правильно понял, связаны с памятью. Вариант одной из таких ошибок на картинке. Как такие ошибки исправлять? Поделитесь опытом, товарищи!
Миниатюры
Как устранять ошибки памяти?  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FraidZZ
Модератор
 Аватар для FraidZZ
3894 / 1520 / 229
Регистрация: 06.01.2013
Сообщений: 4,048
Завершенные тесты: 1
30.06.2014, 17:14     Как устранять ошибки памяти? #2
Приведите исходные коды.
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 73
30.06.2014, 17:32  [ТС]     Как устранять ошибки памяти? #3
Программа сама по себе достаточно объемная. Если интересует какой то конкретный фрагмент кода выложу без проблем.
gray_fox
What a waste!
 Аватар для gray_fox
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
30.06.2014, 23:02     Как устранять ошибки памяти? #4
МихаилХ, использовать ПО для обнаружения утечек памяти и пр., типа valgrind memcheck, правда что есть такого под Win я не в курсе.
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,309
01.07.2014, 09:01     Как устранять ошибки памяти? #5
День добрый! Есть программа с которой очень много проблем, проблемы заключаются в том, что программа падает с ошибкой, но иногда запускается. Ошибки , если я правильно понял, связаны с памятью. Вариант одной из таких ошибок на картинке. Как такие ошибки исправлять?
1) Дебаг-сборка.
2) Агрессивная расстановка assert. В функции больше трех строчек - поставьте хоть один assert. Пусть проверит что ни будь. Например, входные аргументы. Если мамой клянетесь что аргументы правильные, пусть assert проверит их все равно.
3) std::vector, std::map, std::list, std::unique_ptr. Ручного удаления/освобождения памяти через new/delete как можно меньше.
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 73
01.07.2014, 09:29  [ТС]     Как устранять ошибки памяти? #6
С третьим и вторым пунктом все понятно, а дебаг-сборка как то влияет?
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,309
01.07.2014, 09:44     Как устранять ошибки памяти? #7
Без дебаг-сборки нельзя просматривать содержимое переменных, что делает процесс отладки несколько затруднительным. Когда все баги будут переловлены можно будет вернуться на релиз-сборку.
DrOffset
6820 / 4031 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
01.07.2014, 15:19     Как устранять ошибки памяти? #8
МихаилХ,
Разыменование нуля, как на скрине, вполне можно найти отладчиком.
1) Самая действенная практика - это выработать опр. правила, которые помогут меньше совершать ошибки. Это проще, чем их потом искать. Следим за константностью, код должен быть простым и понятным - каждая функция решает свою задачу, избегаем god-object`ов, следим за контрактами (как раз именно здесь нужен ассерт, не стоит проверять ассертом все подряд, обычно стоит проверять только контракты. Помним, что ассерт - это инструмент контроля для программиста, а не для конечного пользователя), за владением ресурсов (умные указатели, пулы и т.п.). В целом, стараемся сначала проектировать, а потом писать код.
2) Специализированные инструменты статического анализа (например cppcheck) - помогают предупредить многие ошибки, дополняют первый пункт.
3) Debugger, он же отладчик (ну про это уже говорили).
4) Специализированные инструменты динамического анализа (valgrind, Intel Inspector XE и др.) .
5) Телепатия
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 73
02.07.2014, 12:46  [ТС]     Как устранять ошибки памяти? #9
1) подобная практика безусловно вещь хорошая только дело в том что не я бОльшую часть программы писал. А что такое god-object'ы и контракты?
2) Ни cppcheck ни pvs-studio не выявил серьезных ошибок которые могли бы портить хип. Есть еще какие нибудь средства?
3) - 4)
5) Телепатия - я бы сказал пальцем в небо =)

Добавлено через 2 часа 41 минуту
Хотя самым эффективным методом оказался метод последовательного комментирования кода. Комментировать куски кода, пока программа не перестанет падать, затем методом исключения найти злосчастный кусок с ошибкой.
DrOffset
6820 / 4031 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
02.07.2014, 16:09     Как устранять ошибки памяти? #10
МихаилХ, а 3-4 чем не угодили?

Цитата Сообщение от МихаилХ Посмотреть сообщение
Телепатия - я бы сказал пальцем в небо
После 2-4 млн строк подобного кода (с ошибками) пальцем в небо превращается в интуицию и реально помогает. Как это точно описать я затрудняюсь, но пока молодые 3-4 часа ищут в гугле что же там может быть, ты подходишь и за 10 минут находишь ошибку по наитию. Конечно это не всегда получается, но случае были

Цитата Сообщение от МихаилХ Посмотреть сообщение
Хотя самым эффективным методом оказался метод последовательного комментирования кода. Комментировать куски кода, пока программа не перестанет падать, затем методом исключения найти злосчастный кусок с ошибкой.
Хороший метод.
Еще можно просто исправлять все подозрительные места в районе возникновения ошибки. Иногда где-то есть расстрел памяти и отладчик ничего путного не показывает. А пока исправляешь узкие места, заодно и код изучишь. Раз, и вот ты уже нашел этот выход за границы.
(Да я в курсе про все побочные эффекты этого метода, но иногда игра реально стоит свеч, особенно если времени мало и многих инструментов в наличии нет)

Цитата Сообщение от МихаилХ Посмотреть сообщение
А что такое god-object'ы и контракты?
Контракт - вообще это часть этой методологии. Но даже если ее не использовать - контракты никуда не деваются. Определяя функцию и ее параметры, ты уже создал контракт. Ведь у функции есть определенный набор данных, который допустим и определенный набор, который не допустим.
God object - это такой антипаттерн.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2014, 10:58     Как устранять ошибки памяти?
Еще ссылки по теме:

Динамическое выделение памяти. Ошибки в куче C++
C++ Реализовать «массив целых чисел». Обработать ошибки динамического выделения памяти. Переопределить опе
C++ Ошибки при освобождении памяти
Ошибки с использованием памяти C++
Как написать освобождение памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 73
03.07.2014, 10:58  [ТС]     Как устранять ошибки памяти? #11
3) - 4) пункты в принципе то утраивают =)
У меня стаж пока не очень большой (работаю программистом 1 год), но уже что то вроде интуиции проявляется. А ошибка оказалась банальной: в OnInitDialog в указатели динамически с помощью оператора new создавались объекты. Далее в другой функции в эти же указатели еще раз создавались эти же объекты, не удаляя предыдущие, и, таким образом, как то портился хип. Поставил проверку на указатели и программа заработала. Банально до жути. =)

P.S. Спасибо за информацию про контракты и God Object'ы.
Yandex
Объявления
03.07.2014, 10:58     Как устранять ошибки памяти?
Ответ Создать тему
Опции темы

Текущее время: 07:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru