0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
1 | |
Потеря памяти в программе23.10.2012, 20:07. Показов 2775. Ответов 28
Метки нет (Все метки)
Подскажите пожалуйста, как отловить в каком месте происходит потеря памяти? Программа считает, но если открыть диспетчер задач, то файл подкачки растет до 2ГБ и программа перестает считать, а там внутри цикл, который должен работать долго.
------------------------------- Приложен txt с кодом. Коду не пугаться =)
0
|
23.10.2012, 20:07 | |
Ответы с готовыми решениями:
28
Потеря памяти Потеря памяти Потеря памяти на оперативке Повторная потеря оперативной памяти |
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
23.10.2012, 20:30 | 2 |
Всю память, выделенную через new, надо чистить с помощью delete
Можно сделать себе вспомогательные макросы, которые считают, сколько раз был вызван new и сколько delete. От утечек это не спасет, но вы хотя бы будете в курсе
0
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
||||||
23.10.2012, 21:21 [ТС] | 3 | |||||
0
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
24.10.2012, 06:32 [ТС] | 5 |
На самом деле это было почти очевидно, потому что этот код отличается от предыдущего только этим куском. Только вот я не могу понять как удалять эту память. Если я раскомментирую delete[] у меня вылетает фатал еррор. Понятно, что я делаю что-то не так. Только вот что... Т.к. в другом месте подобное удаление работает а отличие от него, видимо, в силу своей неопытности я найти не могу =(
0
|
Неэпический
|
||||||||||||||||
24.10.2012, 06:53 | 6 | |||||||||||||||
Например, в функции tree есть утечка:
Сначала
В функции get_B тоже самое:
0
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
24.10.2012, 09:09 [ТС] | 7 |
Вопрос как раз именно в том, как правильно бороться =) Этого я не знаю, пробовал способы, вылетаю фатал ерроры =(
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
24.10.2012, 12:11 | 8 |
Объясните логику вашего кода. В функции get_B() вам с какой нужно памятью работать: с той, что выделяется в этой функции, или с той, что выделяется в функции direct_multiple()? Тут проблема даже не в самих утечках памяти, а в нелогичном коде.
Добавлено через 5 минут Почему фатал еррор вылетает не понятно, всего кода не видно. Но дело не в этом. Нужно код нормальный сделать, а не просто коменты ставить.
0
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
24.10.2012, 17:02 [ТС] | 10 |
Можете ли вы подсказать название книжки?
Добавлено через 27 секунд Код приложен к первому посту =)
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
24.10.2012, 17:10 | 12 |
0
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
24.10.2012, 17:13 [ТС] | 14 |
Никто конкретно подсказать не может, жаль, я сильно надеялся, пойду дальше самостоятельно рыть книжки и говорить с гуглом.
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
24.10.2012, 17:26 | 15 |
У вас, в первом посте, код один выложен, а дальше куски совсем уже другие. В коде из первого поста matrfi и matrthfi объявлены в глобальной области, и память там под них выделяется.
Добавлено через 53 секунды По какому коду подсказывать?
0
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
24.10.2012, 17:37 [ТС] | 16 |
Во второй кусок matrfi и matrthfi перемещены, чтобы было ясно, что это такое. Они только этим и отличаются. Собственно вопрос вокруг всего этого и крутится, где и как лучше выделить память и как избежать её утечки(излишнего накопления, что процесс не может далее продолжаться).
0
|
Неэпический
|
|
24.10.2012, 17:41 | 17 |
Судя по коду, Вы не внимательно читали книжки... либо совсем не читали, поэтому в Вашем коде утечки вообще на каждом шагу.
Освобождать память нужно тогда, когда она более не нужна и обнулять указатель.
0
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
24.10.2012, 17:46 [ТС] | 18 |
Каюсь, читал мало, кодю как умею. Какими командами это можно сделать? Я знаю delete[], но не совсем понимаю, как она работает...
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
24.10.2012, 17:54 | 19 |
Для начала. В main(), в цикле for(), при каждой итерации цикла, указателю z присваивается адрес новой памяти, выделенной в функции funkg(). Значит в конце итерации (после printf) эту память можно освобождать: delete [] z; Не решение проблемы, но для начала.
1
|
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
|
|
24.10.2012, 18:34 [ТС] | 20 |
Как я догадываюсь основная проблема у меня в том, что когда я из функции get_B() вызываю функцию direct_multiple() у меня происходит накопление памяти. Как от него избавиться не ясно. Когда перед return прописываю delete[] matrfi и matrthfi, в которые я передаю direct_multiple() вылазит фатал, из-за чего конкретно и в чем косяк разобраться пока что не выходит.
0
|
24.10.2012, 18:34 | |
24.10.2012, 18:34 | |
Помогаю со студенческими работами здесь
20
Генерация сигнатуры файла. Потеря памяти Backdoor и потеря памяти на системном диске Утечка памяти в программе Утечка памяти в программе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |