Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите найти утечку памяти, std, list 
:(
    Опции темы
azesmcar
Дата 15.4.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



ZC1989,

ИванМ правильно заметил, ты не копируешь данные, ты копируешь указатели..после очистки памяти данные стираются, а указатели остаются, используй std::string, или скачай библиотеку для C++, там поменьше проблем будет.
PM   Вверх
bsa
Дата 15.4.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(ZC1989 @  15.4.2010,  17:05 Найти цитируемый пост)
а на счёт того что я передаю ссылки в массив и после делаю clear(); - удаляются ли содежимые этих ссылок? или так и продолжают висеть в памяти? 
После освобождения памяти нужно считать, что она больше недоступна. Другими словами код:
Код
char *x = new char[100];
strcpy(x, "xxx");
char *y = x;
delete []x;
std::cout << y;
ошибочен, так как происходит доступ к памяти, которая уже может быть занята другими вещами.

PM   Вверх
ZC1989
Дата 15.4.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



azesmcar, это лишний гемор, а нельзя что ли стереть всё? циклом или как угодно?

Добавлено через 3 минуты и 6 секунд
bsa, по твоему примеру у меня получается наоборот, я хочу удалить x через y


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ИванМ
Дата 15.4.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



ZC1989, как я понимаю, вы C++ и STL знаете более менее. Поэтому советую пользоваться "умными" указателями auto_ptr, а лучше бустовскими и забыть про кошмар с освобождением памяти. Я лично теперь только так и работаю.
PM MAIL   Вверх
ZC1989
Дата 15.4.2010, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



ИванМ, я попробую это, но вот чисто раде интереса, почему я н могу освободить ту память, учитывая что я могу её вывести в каком угодно виде на экране, даже функция free даёт вылет программы...непонимаю....

Добавлено через 2 минуты и 28 секунд
list<ms_Data> ::iterator i_arr;

for(i_arr = arrDocs->begin(); i_arr != arrDocs->end(); i_arr++){
    if((*i_arr)._type = mst_Folders) free((*i_arr).title);
}

arrDocs->clear();


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ИванМ
Дата 15.4.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



ZC1989, грубо говоря освободить память может только тот, кто ее выделял. Если вы ее не выделяли, то и освободить вы ее не можете. Это не точно, но  вашем случае это так.
PM MAIL   Вверх
ZC1989
Дата 15.4.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



аа, ну тогда это более правдопободно...


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ZC1989
Дата 18.4.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



это сново я...
переделал полностью списики. теперь очищается полностью всё что выделяется и как я думаю это не должно как то влиять на размер программы в памяти.
но получается странный эффект: через 
_CrtMemDumpAllObjectsSince(&_ms);
вывожу всю неочищенную память и при закрытии программы -  выделенная память полностью очищена, с этим проблем нету.

но когда я обновляю список, (в 1400 позиций) размер ехе всё равно ростёт!
поставил вывод занятой памяти прямо после очистки массива и наблюдаю такую картину
что при каждом обновлении остаются только 11 переменных (как и должно быть) - ничего лишнего не остаётся, но почему тогда прирост в памяти???

может быть это вызвано тем что проект Debug?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0899 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.