Russian Qt Forum

Qt => Общие вопросы => Тема начата: xaleva от Ноябрь 09, 2009, 22:24



Название: Память не очищается после создания объекта 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();
stream.flush();
Это во всяком случае неразумный эксперимент. Если реализовать "2" - 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();
stream.flush();
Это во всяком случае неразумный эксперимент. Если реализовать "2" - 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К
====
Утечки скорее нет(особенности выделения памяти приложению операционной системой)

Если есть утечка, то память как правило кушаеться линейно на аодобных тестах.