Russian Qt Forum
Ноябрь 23, 2024, 14:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Память не очищается после создания объекта QFile  (Прочитано 5861 раз)
xaleva
Гость
« : Ноябрь 09, 2009, 22:24 »

 :)Добрый вечер всем.У меня вопрос опять связанный с памятью :)Создаю поток и в ране пишу QFile fl(...); ну и т.д,в конце соотвестно закрываю fl.close();.При этом при уничтожении потока память не полнустью очищается,правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению.Почему это происходит?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Ноябрь 09, 2009, 23:14 »

возможно класс содержит статические переменные. Зачем их удалять, если они могут потом понадобиться? И чем память мерял?
Записан
spectre71
Гость
« Ответ #2 : Ноябрь 09, 2009, 23:44 »

:)Добрый вечер всем.У меня вопрос опять связанный с памятью :)Создаю поток и в ране пишу QFile fl(...); ну и т.д,в конце соотвестно закрываю fl.close();.При этом при уничтожении потока память не полнустью очищается,правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению.Почему это происходит?

Каким образом это было зарегистрировано?? - "память не полностью очищается".
"правда при следующем запуске она всегда после закрытия возвращается к одному и тому же значению" - вполне нормальная ситуация!
Объяснять почему это может происходить(без утечки) - долго.
Если сомневаетесь, есть ли утечка памяти, самое простое - прогнать по циклу "возможное слабое место" 1000-1000000 раз и посмотреть, есть ли утечка.


Записан
xaleva
Гость
« Ответ #3 : Ноябрь 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;

Вот...после каждого выполнения этого кода происходит утечка.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 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 циклов память исчерпалась. Иначе это не баг репорт а так - "воспоминания о будущем"
Записан
xaleva
Гость
« Ответ #5 : Ноябрь 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)я ведь зацикливал)результат-память уходит,до исчерпываня не доводил,но ведь мне нужно чтобы он ваще не наращивался)точнее разве я не должен к этому стремится?))
Записан
xaleva
Гость
« Ответ #6 : Ноябрь 10, 2009, 20:35 »

Щас вот зациклил на 1000 раз,выполнялся ток этот код,выходит что растет с 5380К до 5540К..
Записан
xaleva
Гость
« Ответ #7 : Ноябрь 10, 2009, 20:46 »

Хм...пока ждал ответа память снизилась до 5172 Веселый ок,вечно я куда то тороплюсь,все норм
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 10, 2009, 21:20 »

Хм...пока ждал ответа память снизилась до 5172 Веселый ок,вечно я куда то тороплюсь,все норм
(У)течка - дело такое, надо четко доказать, иначе никто слушать не будет
Записан
spectre71
Гость
« Ответ #9 : Ноябрь 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К
====
Утечки скорее нет(особенности выделения памяти приложению операционной системой)

Если есть утечка, то память как правило кушаеться линейно на аодобных тестах.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.