Название: Память не очищается после создания объекта QFile Отправлено: xaleva от Ноябрь 09, 2009, 22:24 :)Добрый вечер всем.У меня вопрос опять связанный с памятью :)Создаю поток и в ране пишу QFile fl(...); ну и т.д,в конце соотвестно закрываю fl.close();.При этом при уничтожении потока память не полнустью очищается,правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению.Почему это происходит?
Название: Re: Память не очищается после создания объекта QFile Отправлено: Авварон от Ноябрь 09, 2009, 23:14 возможно класс содержит статические переменные. Зачем их удалять, если они могут потом понадобиться? И чем память мерял?
Название: Re: Память не очищается после создания объекта QFile Отправлено: spectre71 от Ноябрь 09, 2009, 23:44 :)Добрый вечер всем.У меня вопрос опять связанный с памятью :)Создаю поток и в ране пишу QFile fl(...); ну и т.д,в конце соотвестно закрываю fl.close();.При этом при уничтожении потока память не полнустью очищается,правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению.Почему это происходит? Каким образом это было зарегистрировано?? - "память не полностью очищается". "правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению" - вполне нормальная ситуация! Объяснять почему это может происходить(без утечки) - долго. Если сомневаетесь, есть ли утечка памяти, самое простое - прогнать по циклу "возможное слабое место" 1000-1000000 раз и посмотреть, есть ли утечка. Название: Re: Память не очищается после создания объекта QFile Отправлено: xaleva от Ноябрь 10, 2009, 19:59 :)Добрый вечер всем.У меня вопрос опять связанный с памятью :)Создаю поток и в ране пишу QFile fl(...); ну и т.д,в конце соотвестно закрываю fl.close();.При этом при уничтожении потока память не полнустью очищается,правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению.Почему это происходит? Каким образом это было зарегистрировано?? - "память не полностью очищается". "правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению" - вполне нормальная ситуация! Объяснять почему это может происходить(без утечки) - долго. Если сомневаетесь, есть ли утечка памяти, самое простое - прогнать по циклу "возможное слабое место" 1000-1000000 раз и посмотреть, есть ли утечка. Это было зарегистрировано с помощью Process Explorer.Насчет того что утечка какая то есть,уверен,пробывал оба варианта-и закомментирование и циклическое выполнение.Приведу кусок кода,посмотрите,может чтот неверно удаляю. locker.lock(); dt=QDate::currentDate().toString("dd.MM.yyyy"); QFile *fl=new QFile(QDir::current().absolutePath()+"/log_dir/"+dt+".txt"); can_read=true; //Checking if file exists if(!fl->exists()) { can_read=false; } //--END-- //Checking if file has read attribute if(!fl->open(QIODevice::WriteOnly|QIODevice::Append)) { can_read=false; } //--END-- tm=QTime::currentTime(); time_now=tm.toString("hh:mm:ss"); QTextStream stream(fl); stream << dt+" "+time_now+" "+" "+val.replace("\n","").replace("\r","")+"\n"; fl->close(); stream.flush(); locker.unlock(); delete fl; Вот...после каждого выполнения этого кода происходит утечка. Название: Re: Память не очищается после создания объекта QFile Отправлено: Igors от Ноябрь 10, 2009, 20:23 1) locker имеет отношение к делу? Ваше дело проверить
2) деструктор QFile вызывает close так что проще QFile fl(тew QFile(QDir::current().absolutePath()+"/log_dir/"+dt+".txt")); 3) Интересно как stream вытолкнет данные если файл уже закрыт? Код: fl->close(); 4) В любом случае: как люди сказали, зациклите фрагмент кода чтобы утечка была очевидной и чтобы после N циклов память исчерпалась. Иначе это не баг репорт а так - "воспоминания о будущем" Название: Re: Память не очищается после создания объекта QFile Отправлено: xaleva от Ноябрь 10, 2009, 20:28 1) locker имеет отношение к делу? Ваше дело проверить 2) деструктор QFile вызывает close так что проще QFile fl(тew QFile(QDir::current().absolutePath()+"/log_dir/"+dt+".txt")); 3) Интересно как stream вытолкнет данные если файл уже закрыт? Код: fl->close(); 4) В любом случае: как люди сказали, зациклите фрагмент кода чтобы утечка была очевидной и чтобы после N циклов память исчерпалась. Иначе это не баг репорт а так - "воспоминания о будущем" 1)locker это мютекс,к этому участку обращаются из всех потоков,так что я посчитал что он необходим. 2)пробывал,результат тот же,у меня ваш вариант стоял изначально 3)сорри)это просто так,рассматривал всевозможные,а точнее невозможные варианты 4)я ведь зацикливал)результат-память уходит,до исчерпываня не доводил,но ведь мне нужно чтобы он ваще не наращивался)точнее разве я не должен к этому стремится?)) Название: Re: Память не очищается после создания объекта QFile Отправлено: xaleva от Ноябрь 10, 2009, 20:35 Щас вот зациклил на 1000 раз,выполнялся ток этот код,выходит что растет с 5380К до 5540К..
Название: Re: Память не очищается после создания объекта QFile Отправлено: xaleva от Ноябрь 10, 2009, 20:46 Хм...пока ждал ответа память снизилась до 5172 :D ок,вечно я куда то тороплюсь,все норм
Название: Re: Память не очищается после создания объекта QFile Отправлено: Igors от Ноябрь 10, 2009, 21:20 Хм...пока ждал ответа память снизилась до 5172 :D ок,вечно я куда то тороплюсь,все норм (У)течка - дело такое, надо четко доказать, иначе никто слушать не будет Название: Re: Память не очищается после создания объекта QFile Отправлено: spectre71 от Ноябрь 10, 2009, 22:08 Щас вот зациклил на 1000 раз,выполнялся ток этот код,выходит что растет с 5380К до 5540К.. Пример теста: ==== считаешь delta(утечки) на одну итерацию. прогоняешь 1000 -> например, растет с 5000К до 5100К.. (delta = ~100 Byte) прогоняешь еще(не выгружая приложение) 5000 -> например, растет с 5100К до 5350К.. (delta = ~50 Byte) прогоняешь еще(не выгружая приложение) 20000 -> например, растет с 5350К до 5550К.. (delta = ~10 Byte) прогоняешь еще(не выгружая приложение) 20000 -> не растет, а может и уменьшилась, например до 5100К ==== Утечки скорее нет(особенности выделения памяти приложению операционной системой) Если есть утечка, то память как правило кушаеться линейно на аодобных тестах. |