![]() |
|
|
![]()
|
|
| kometa_triatlon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
У меня такая ситуация сложилась...
У меня есть коллекция объектов (тип CObArray ) моего типа CVarItem. В процессе работы программы я добавляю в него новые объекты:
Вот только при этом получаются бешеные утечки памяти, потому что я ее не освобождаю. Если освобождаю:
то вылетаю с exception 0xC0000005: Access violation reading location 0xfeeefeee. Ничего не могу понять, я что, лезу куда-то не туда в память?? Полный код функции вот:
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||
|
|||||||
| Mad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
Замени на CPtrArray, только не забуть потом удалить эти обьекты (когда они уже будут не нужны) |
||||
|
|||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Mad
Заменил, то же самое .... -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
kometa_triatlon
А тебе обязательно нужен дву-направленный список ? (просто на практике почти всегда удаеться обойтись одно-направленным) если нет, то попробуй просто написать свой контейнер для хранения (я лично вообще не использую контейнеры из MFC |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 1 Всего: 10 |
В списке ты хранишь не обьекты, а указатели на них. Освобождаешь память - указатели указывают в никуда, отсюда и ехсепшины. Для освобождения памяти добавь процедурку
Почистит весь список Это сообщение отредактировал(а) threef - 26.11.2005, 09:43 |
|||
|
||||
| AlexPro |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Это зачем? Сделай так:
и все будет работать |
||||
|
|||||
| Mad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
AlexPro
и
в сути одно и тоже, только в первом случае ты сам определяеш локальную переменную класса, а во втором это делает за тебя компилятор |
||||
|
|||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Некоторые не поняли наверное вопроса
Мне не нужно удалять список. Я получил в процессе работы некоторые данные. Теперь хочу добавить их в коллекцию. Я создаю динамически новый объект, загоняю в него данные, потом этот объект добавляю в коллекцию. Я думал, что сама инфа заносится в коллекцию и я могу удалять объект. Получается, сам контейнер не хранит информацию, а лишь указывает на нее? Как мне лучше обойти это? Создать какой-то дежурный объект моего класса, каждый раз при занесении новой информации изменять данные в нем и потом заносить? -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Mad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
Коллекция (вообщето если точно то контейнер) хранит или указатели на обьекты, или ссылки на одьекты, Самиже обьекты контейнеры не хранят.
А как ты хочеш хранить информацию, и при этом не занимать память ;) Что-бы минимизировать использование памяти, храни указатели на обьекты класса, хранящии информацию Можно еще хранить данные не в классе, а в структуре (расход памяти еще снизиться, а контейнеру до лампочки на что указатель) |
||||
|
|||||
| kometa_triatlon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Я так и делаю) Интересно, а как же мне тогда освободить память? После завершения вывода результатов вызвать что-то типа:
? Кстати, я пробовал так сделать, но вылетел с exception Обрисую ситуацию: Есть диалоговое приложение, которое использует функции из DLL. В библиотеку я передаю строку, обратно получаю указатель на СPtrArray У меня два таких контейнера: один в классе диалога, другой в классе библиотеки, я сначала заполняю библиотечный, потом возвращаю указатель на него клиенту:
Run - функция из dll. Вот не пойму, как освободить память... Если я уже в самом конце работы после выведения данных из контейнера пытаюсь его (тот, который в классе диалога) удалить в цикле (см. выше) , то вылетаю Добавлено @ 03:07 Есть все-таки MFC-контейнеры, которые хранят информацию, а не указатели? Может быть CObList? -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||
|
|||||||
| Mad |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
Он хранить только ссылки на обьекты класса.
есть более простой способ (и использование памяти меньше
Могут быть какието ошибки (писал прямо тут, и компилить не пробывал Кстати сам CPtrArray примерно так и работает, просто в него добавленно еще целаю куча разных ассертов, и возможностей |
||||||
|
|||||||
| threef |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 1 Всего: 10 |
Обрати внимание именно на
**pArray Если ты хочешь вернуть распределенный массив из функции, то ты должен передавать не массив(*pArray), а ссылку на него(**pArray). Кроме того, есть шаблонные классы, способные спокойно хранить обьекты а не ссылки на них: CArray <itemType,itemType>MyArray; CList <itemType,itemType>MyList; Только учти, что хранятся КОПИИ обьектов,так что в случае распределения ресурсов в самом обьекте необходимо предусмотреть все в конструкторе копирования. Или храни указатели.
Посмотри, что за ехсепшн, где он возникает
Не сильно доверяй этому утверждению, расход памяти не зависит от того, структура это или класс. С точки зрения C++ это равнозначно, различия только в доступе по умолчанию. Это сообщение отредактировал(а) threef - 28.11.2005, 11:21 |
||||||
|
|||||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: нет Всего: 5 |
Расскажи об этом вектору, листу, мапу... А то они этого не знает, и каждый раз в себя копируют объекты, подлецы -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Mad
А что, хороший способ, действительно мог бы и додуматься передавать мой контейнер в функцию из библиотеки, чем копировать... Neitron Давно мне, бездельнику, пора бы выучить STL... threef
Я и не доверяю ОК, кое-какие идеи появились, будем реализовывать... -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |