![]() |
|
Модераторы: bsa |
![]()
|
|
| Nick007 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 13.4.2010 Где: СССР Репутация: нет Всего: нет |
Всем доброго времени суток.
у меня есть класс в котором сохраняется массив сообщений которы в определенный момент выводит их все разом
В нем есть функция добавления
во время добавления счетчик увеличивается после вывода массива сообщений обнуляется во время выполнения программы (при добавлении сообщений) происходит увеличение занимаемой программой памяти после создания нового массива память остается занятой я пытался некоторыми способами избавиться от этого эффекта но мои усилия ни к чему не привели помогите пожайлусто правильно освобождать память от ставших не нужными сообщений ------------------- на форуме и в нете нашел множество примеров показывающих как нужно освобождать память но в поем примере они либо не производят ни какого эффекта , либоприводят к возникновению ошибки (обычно во время добавления второго сообщения в массив) скорее всего , что я что то не правильно делал или не делал ------------------ буду очень благодарен всем кто сможет помоч в развязании данной проблемы |
||||
|
|||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Nick007, я вообще не понял что ты хотел сказать этой программой. У тебя член класса LPWSTR *ls нигде не используется а в методе MessgAdd происходит выделение памяти для массива, который нигде потом не используется и не уничтожается, естественно происходит утечка памяти.
Ты лучше подробнее расскажи свою задачу. Потому что твой алгоритм никуда не годится. |
|||
|
||||
| Nick007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 13.4.2010 Где: СССР Репутация: нет Всего: нет |
данный класс накапливает сообщения создаваемые основной программой для их вывода во время вызова определенной функции
вывод в окно производится при помощи функций DirectX вот все методы класса:
в методе void Messg::MessgAdd (по моему замыслу) должно происходить происходит создание нового массива ,заполнение значениями из старого(если они есть) и замена старого на навый после этого нужно освободить память от строк не попавших в новый массив но у меня они остаются висеть в памяти что и является проблемой Это сообщение отредактировал(а) Nick007 - 17.4.2010, 00:29 |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Каким образом он накапливает? Как я понимаю по вашему замыслу должна прибавляться строка к существующей строке или как? Если так то, есть стандартные функции работы со строками. Если делать как вы, то по шагам это должно быть так: 1)Создание нового массива с длиной старого + длина новых данных. 2)Копирование данных из старого массива в новый и прибавление новых данных 3)Уничтожение старого массива Плюс написать в деструкторе освобожение текущего массива, если он непустой. Добавлено через 2 минуты и 6 секунд После создания нового массива присвоить соответствующему члену класса значение (указатель) нового массива. |
|||
|
||||
| Nick007 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 13.4.2010 Где: СССР Репутация: нет Всего: нет |
сообщения добовляются при помощи следующего кода:
а выводятся вот так:
|
||||
|
|||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Nick007, лучше этот код встроить в функцию MessgAdd, а передавать первым параметром строку-константу, второй X. Меньше геморроя будет с выделением / освобождением памяти.
|
|||
|
||||
| Nick007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 13.4.2010 Где: СССР Репутация: нет Всего: нет |
в функции MessgAdd
был цикл освобождения массива привем несколько вариантов но все не удачные щас они закоментированы процесс создания/добавления у меня такой как вы описали а с уничтожением возникла проблема над которой я целый день бьюсь при постоянном выводе десятка строк программа (при их постоянном обновлении) накапливает память с угрожающей скоростью гдето через минуту слетает вообще Добавлено через 8 минут и 13 секунд другой вариант ввода:
Это сообщение отредактировал(а) Nick007 - 17.4.2010, 00:58 |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Прямо такой. Давайте по моим шагам. Соответствие что я написал и что у вас написано. Естественно, потому что вы два раза выделяете память и нигде ее не освобождаете. Но сначала давайте разберемся с выделением памяти. У вас тоже неправильно все сделано. Кстати я сам затупил. Щас все объясню. Это сообщение отредактировал(а) ИванМ - 17.4.2010, 01:04 |
|||
|
||||
| ИванМ |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
К этому коду
добавьте
В методе MessgAdd копируйте полученное значение в новое. Тогда с вышеописанным освобождением памяти мы покончили. Теперь будем думать что делать с массивом строк. Тут проблема с тем, что заранее неизвестно количество элементов массива ls. Это на самом деле глобальная проблема, можно целую теорию развести. В общем нужно создать сначала массив строк определенной длины. Потом, при переполнении его,создавать новый с большим размером все из него построчно из старого копировать в новое. В стандарте предусмотрено 2 варианта: либо увеличить размер массива в 2 раза, либо 1,5 раз больше исходного. После выполнения этой операции вы присваиваем члену класса ls значение указателя на полученный массив. Кроме того, необходимо создать деструктор, который будет построчно удалять все строки этого массива delete[] ls[i] и потом сам массив delete[] ls; И все, проблема будет решена. Это сообщение отредактировал(а) ИванМ - 17.4.2010, 01:19 |
||||
|
|||||
| Nick007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 13.4.2010 Где: СССР Репутация: нет Всего: нет |
объясните что я делаю не правильно |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
| Nick007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 13.4.2010 Где: СССР Репутация: нет Всего: нет |
изначально количество элементов равно нулю
при добавление одного сообщения счетчик увеличивается на 1 после вывода сообщений их количество снова равно нулю Добавлено через 1 минуту и 43 секунды как правильно скопировать массив из LPWSTR ? |
|||
|
||||
| ИванМ |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Nick007,
Т.е. вы каждый раз при получении нового сообщения пересоздаете массив с размером больше исходного на 1 элемент. Это не грамотно. Надо его увеличивать на большее число. Nick007, после вывода сообщений их количество снова равно нулю [/quote] Значит после вывода сообщений надо тоже удалять весь массив. Но в деструкторе тоже необходимо сделать. В общем если заменить этот код:
на
то вроде должно работать. И еще не забудьте добавить
после передачи сообщения. Это сообщение отредактировал(а) ИванМ - 17.4.2010, 01:33 |
||||||||
|
|||||||||
| Nick007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 13.4.2010 Где: СССР Репутация: нет Всего: нет |
Был такой вариант:
но он работал только если в стеке была только одна строка при добавлении второй проскакивало исключение |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |