| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > delete |
| Автор: gepard 14.10.2004, 12:12 |
| Проблема в том, что с помощью new у одного указателя я выделяю порядка 1 мега памяти в процессе программы.Когда я вызываю delete, то чистится памяти только порядка 100-400 кб. Почему? И как мне чистить всю память? |
| Автор: _hunter 14.10.2004, 12:22 |
| а она точно не освобождается ( CodeGuard вопит, например ) или это TaskManager показывает? |
| Автор: chipset 14.10.2004, 12:33 |
| gepard А может в тех обьектах который удаляешь есть какие то свои указатели на области памяти и надо их в деструкторе удалять? |
| Автор: Step 14.10.2004, 12:43 |
| тебе выдало сообщение что есть утечка памяти... ???? |
| Автор: gepard 14.10.2004, 13:05 | ||||||
Нет
Нет
В одном классе - да, а в другом нет. Значит память, если есть ещё вложенный указатель, из-под него надо отдельно освобождать? Попробуем... |
| Автор: chipset 14.10.2004, 13:07 | ||
А для чего по твоему созданы деструктора? |
| Автор: gepard 14.10.2004, 13:13 |
| Стоп... правильно...я освобождаю... У меня всё правильно в коде. Я в дестукторе освобождаю память! Лажа в чём-то другом |
| Автор: _hunter 14.10.2004, 13:20 |
| не совсем понятен "нет" на мой вопрос "нет" относится к части про CodeGuard или к части про TaskManager? |
| Автор: gepard 14.10.2004, 13:29 |
| _hunter CodeGuard - ??? TaskManager - неа... Кстати, я сейчас позырил ещё раз: нет, это я в другом проекте брал указатель в классе, который являлся указателем(класс). Тут в чём-то другом лажа... |
| Автор: chipset 14.10.2004, 13:31 |
| Короче без кода нифига не понимаю.. |
| Автор: _hunter 14.10.2004, 13:35 |
| CodeGuard -- в Builder' e следит за утечками но код бы не помешало увидеть ;) |
| Автор: Vyacheslav 14.10.2004, 13:45 |
| CodeGuard не используется, ТaskManager не показывает, тогда откуда данные об утечке? От Святого Духа? |
| Автор: DENNN 14.10.2004, 14:59 |
| Я думаю, что все же брались данные с таскменеджера Память то освобождается, просто винда не спешит выделенную страницу памяти у приложения отбирать - вдруг сейчас опять попросят |
| Автор: gepard 15.10.2004, 04:19 |
| Vyacheslav Ошибка по типу "отправить отчёт" или "Не отпралвять" Код вечерком выложу... Сейчас в ВУЗ надо валить |
| Автор: Adil' 15.10.2004, 08:45 | ||
И причем здесь утечка памяти?! Скорее наоборот - "наступил" на не выделенную |
| Автор: val 15.10.2004, 09:36 |
| На всякий случай попробуй повставлять printf(ы) во все твои деструкторы, возможно, кто-то кого-то не вызывает... И еще, иногда память может реально освободится от старых мапов только если дать новую команду её захватить... |
| Автор: gepard 15.10.2004, 15:15 |
| Adil' Глупости городишь. Ошибка-то при delete получается. Памяти освобождается мало... Короче ладно. Я буду всё равно сейчас структуру переделывать... Если тажа хрень будет - подниму тему |
| Автор: chipset 15.10.2004, 15:36 |
| В последние четыре поста (кроме Val'иного) не врубился нифига.. |
| Автор: Adil' 15.10.2004, 16:02 | ||||||
Такая ошибка обычно вылезает, если delete обращается к "левому" адресу, уже освобожденному, но не обнуленному, например. |
| Автор: Vyacheslav 15.10.2004, 16:55 | ||
Ну и терминология. Если имеется в виду Access Violation, то она как раз должна на delete и наооборот означает то что памяти особождается через чур много Ты где-то особождаешь то что еще не выделил или проводишь освобождение по второму разу. |
| Автор: bel_nikita 16.10.2004, 00:10 |
| gepard я не знаю, но если юзаешь классы и динамическое выделение/удаление объектов, то все базовые классы должны быть с виртуальными деструкторами: virtual ~ClassDestructor(); |
| Автор: gepard 16.10.2004, 08:57 | ||
| Vyacheslav У меня в голове все проекты перемешались: ошибка по типу "Отправлять отчёт или нет" вылезает у меня в другом проекте, а в этом просто памяти мало освобождается. Вот исходник
Функция somefunction() вызывается по нажатию опред. клавиши. |
| Автор: MaxWave 8.3.2006, 20:50 | ||
| Люди, спасите помогите!!! Короче есть игра - змейка. Я создаю раздные доски (та, по к-й движется змея) размером m*n. Есть ф-я, которая загружает доску опр. размера. Юзер щелкае по вариантам, и доски меняются. В начале ф-ии делаем так:
Это есть типа "2-мерный " массив доски, где в каждую клетку заносится цифра для служебного пользования. Прожект компилится, запускается, все окей. Причем в Debug компиле никаких проблем (только тормозов больше). Когде делаем Relise, запускается все окей. Но когда начинаем многократно менять доски, т.е вызывать эту ф-ю, то прога вылетает (отправить отчет или нет). В чем может быть дело??? ссылка на змею http://www.ogre3d.org.ru/download.php?list.6 |
| Автор: MAKCim 8.3.2006, 22:11 |
| gepard в приведенном коде насколько я вижу нет утечки, с чего ты взял, что она есть? |
| Автор: Nuzur 9.3.2006, 10:31 | ||||
Угу, из-за утечек ничего тебе не скажут, кроме того что с работы уволят(тьфу, тьфу, тьфу) и поночам спать трудно(если конечно совесть есть). |
| Автор: Neitron 9.3.2006, 13:19 | ||
Гы, гы))) Да да.... Утечка мучает всегда и кошмарные сны, когда компьютер орет, на тебя во сне. |
| Автор: CPlusPlusFAN 13.3.2006, 03:06 | ||
| MaxWave, Попробуй так:
А чего, в конце не удаляешь? |
| Автор: MaxWave 13.3.2006, 20:02 | ||||
А чем эта лучше? Не удаляю в конце, т.к
вызывается у меня все время c разными m и n. А перед созданием нового массива надо удалить старый. Скачай с cсылки змею, там есть эта строчка, посмотри, мож че скажешь... (ф-я loadScene). |
| Автор: CPlusPlusFAN 15.3.2006, 17:40 | ||||
| MaxWave, Вот это:
для этого:
чтобы не удалять того, чего нет. А следовало бы, чтобы massiv у тебя не зависал в памяти. (Удаляй при завершении программы) |
| Автор: CPlusPlusFAN 15.3.2006, 18:34 | ||||||
| MaxWave, я скачал: работа выполнена на совесть. Я видел у тебя несколько таких удалений массива. Поэтому я бы посоветовал тебе каждый раз, когда что-то удаляешь, проверить на NULL: вначале
затем
а уж потом, когда надо
Я конечно не уверен, но такие ошибки могут быть из-за вмешательства в память. Посмотри, не удаляешь ли ты ещё какой-нибудь указатель... Последний раз, когда у меня была такая ошибка, я пытался в Виндосе работать с прерываниями... |