Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

День добрый! Есть программа с которой очень много проблем, проблемы заключаются в том, что программа падает с ошибкой, но иногда запускается. Ошибки , если я правильно понял, связаны с памятью. Вариант одной из таких ошибок на картинке. Как такие ошибки исправлять? Поделитесь опытом, товарищи!
0
Миниатюры
Как устранять ошибки памяти?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 17:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как устранять ошибки памяти? (C++):

Ошибки с использованием памяти - C++
Помогите найти ошибки. Нам дано вектор coords формата (x1, y1, x2, y2,...). Нужно найти длину между точками, определить наибольшую длину и...

Исправить ошибки ( распределение памяти ) - C++
Написать программу, в которой матрица размерности n x m размещается в свободной памяти. Элементы целочисленной матрицы заполняются с...

Ошибки при освобождении памяти - C++
В приложении обрабатывается сообщение WM_DROPFILES, при попытке удаления строк szFileNameA и szFileNameW вылетает ошибка "HEAP CURRUPTION...

Динамическое выделение памяти. Ошибки в куче - C++
Функция чтения данных из ячейки экселя wchar_t *DataInCell( Excel::_WorksheetPtr Sheet, int Row, int Col ) Excel::RangePtr Cell; ...

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

Ошибка памяти при выполнении, при компиляции не выводит ошибки - C++
ПОмогите плс программа вводит строку символов до точки, а после вычисляет процент согласных в этой строке и выводит их в обратном порядке....

10
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,177
Завершенные тесты: 1
30.06.2014, 17:14 #2
Приведите исходные коды.
0
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 74
30.06.2014, 17:32  [ТС] #3
Программа сама по себе достаточно объемная. Если интересует какой то конкретный фрагмент кода выложу без проблем.
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
30.06.2014, 23:02 #4
МихаилХ, использовать ПО для обнаружения утечек памяти и пр., типа valgrind memcheck, правда что есть такого под Win я не в курсе.
0
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
01.07.2014, 09:01 #5
День добрый! Есть программа с которой очень много проблем, проблемы заключаются в том, что программа падает с ошибкой, но иногда запускается. Ошибки , если я правильно понял, связаны с памятью. Вариант одной из таких ошибок на картинке. Как такие ошибки исправлять?
1) Дебаг-сборка.
2) Агрессивная расстановка assert. В функции больше трех строчек - поставьте хоть один assert. Пусть проверит что ни будь. Например, входные аргументы. Если мамой клянетесь что аргументы правильные, пусть assert проверит их все равно.
3) std::vector, std::map, std::list, std::unique_ptr. Ручного удаления/освобождения памяти через new/delete как можно меньше.
1
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 74
01.07.2014, 09:29  [ТС] #6
С третьим и вторым пунктом все понятно, а дебаг-сборка как то влияет?
0
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
01.07.2014, 09:44 #7
Без дебаг-сборки нельзя просматривать содержимое переменных, что делает процесс отладки несколько затруднительным. Когда все баги будут переловлены можно будет вернуться на релиз-сборку.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
01.07.2014, 15:19 #8
МихаилХ,
Разыменование нуля, как на скрине, вполне можно найти отладчиком.
1) Самая действенная практика - это выработать опр. правила, которые помогут меньше совершать ошибки. Это проще, чем их потом искать. Следим за константностью, код должен быть простым и понятным - каждая функция решает свою задачу, избегаем god-object`ов, следим за контрактами (как раз именно здесь нужен ассерт, не стоит проверять ассертом все подряд, обычно стоит проверять только контракты. Помним, что ассерт - это инструмент контроля для программиста, а не для конечного пользователя), за владением ресурсов (умные указатели, пулы и т.п.). В целом, стараемся сначала проектировать, а потом писать код.
2) Специализированные инструменты статического анализа (например cppcheck) - помогают предупредить многие ошибки, дополняют первый пункт.
3) Debugger, он же отладчик (ну про это уже говорили).
4) Специализированные инструменты динамического анализа (valgrind, Intel Inspector XE и др.) .
5) Телепатия
1
МихаилХ
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 74
02.07.2014, 12:46  [ТС] #9
1) подобная практика безусловно вещь хорошая только дело в том что не я бОльшую часть программы писал. А что такое god-object'ы и контракты?
2) Ни cppcheck ни pvs-studio не выявил серьезных ошибок которые могли бы портить хип. Есть еще какие нибудь средства?
3) - 4)
5) Телепатия - я бы сказал пальцем в небо =)

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

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

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

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

P.S. Спасибо за информацию про контракты и God Object'ы.
0
03.07.2014, 10:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2014, 10:58
Привет! Вот еще темы с ответами:

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти)) - C++
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

нужно найти ошибки в задаче на языке C/ их в районе 10 как выдает компилятор но я не могу их исправить (не знаю как) - C++
#include <math.h> #include <conio.h> #include <stdio.h> void main() { int xa, ya, xb, yb; cprintf("vvod xa, ya, xb, yb"); ...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? - C++
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru