Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Утечка памяти (copyfile ?)


Автор: nikitos1980 29.6.2009, 18:56
Помогите пожалуйста найти причину утечки памяти...
Я постарался в комментариях в коде описать проблему.

Код

try
       {
        // Блок кода, отображающий путь к файлу, из которого копируется и куда копируется
        SetDlgItemText(IDC_FROM, strFile);
        SetDlgItemText(IDC_TO, strDestination);
        // Получаю размер файла для суммирования общего размера скопированной информации
        CFile tmpSrcFile(strFile, CFile::modeNoInherit);
        pView->m_dRealCopied += tmpSrcFile.GetLength(); // Непосредственно сумма скопированной инфы
        tmpSrcFile.Close();
        // А вот здесь начинает утекать память, я комментировал все блоки кода, кроме функции 
        // CopyFile, и тогда с памятью все ок
        if (CopyFile(strFile, strDestination, FALSE))
        {
         // Здесь я изменяю дату модификации скопированного файла
         // в блоке catch  получаю кучу ошибок, но они не так сейчас волнуют, похоже, что они вызваны
         // тем, что после копирования сразу не всегда можно открыть файл для изменения 
         // даты модификации
         CFile tmpFile(strDestination, CFile::modeNoInherit);
         FILETIME ft;
         SYSTEMTIME st;
         GetSystemTime(&st);
         SystemTimeToFileTime(&st, &ft);
         SetFileTime(tmpFile.m_hFile, (LPFILETIME)NULL, (LPFILETIME)NULL, &ft);
         tmpFile.Close();
        }
        else
        {
         // Вывод ошибки в моем окне вида
         strDestination = CString("Ошибка записи файла ") + strDestination;
         pView->Trace(strDestination);
        }
       }
       catch (CFileException* error)
       {
        pView->Trace(error->m_strFileName);
       }


Автор: jonie 29.6.2009, 19:00
эмн, нескромный вопрос: где в коде вы замерили использование памяти?

Автор: nikitos1980 29.6.2009, 19:20
делаю простым способом: через диспетчер задач виндоус слежу за состоянием памяти приложения
Вижуал студио пишет detected memory leaks, но я как-то не особо беспокоюсь по этому поводу, так как он ругается даже например при созднии связанных списков CTypedPtrList...

Автор: Earnest 29.6.2009, 20:08
Цитата(nikitos1980 @  29.6.2009,  20:20 Найти цитируемый пост)
делаю простым способом: через диспетчер задач виндоус слежу за состоянием памяти приложения

Это еще не утечка: используемая память после вырастания обычно не спешит возвращаться системе. Скажем, хип подрос, глобально он занимает больше места, но после освобождения динамических объектов не уменьшается.

Цитата(nikitos1980 @  29.6.2009,  20:20 Найти цитируемый пост)
Вижуал студио пишет detected memory leaks, но я как-то не особо беспокоюсь по этому поводу, так как он ругается даже например при созднии связанных списков CTypedPtrList... 

А вот это как раз утечка, и напрасно ты не беспокоишься. Эти списки предполагают, что за временем жизни хранимых элементов ты будешь смотреть сам (т.е. удалять после использования).

Автор: nikitos1980 29.6.2009, 20:57
Earnest, я пишу программу для бэкапа файлов: она запускается в теневом режиме, проверяет дату модификации файлов на диске (источнике и адресате), и копирует, если файл был изменен. Иногда объем копируемой информации занимает десятки гигабайт. Если копируется около 1Гб, то у меня возрастает объем памяти (не моего процесса, а общей, справа внизу в окне) на 100-150 Мб! Я не пойму почему она растет, все перерыл, нашел что при копировании... Может ошибки какие-то появляются, и они занимают место. Пробовал в блоке catch (CFileException* error) убить error (error->Delete()) - не помогает...

Автор: Alexeis 29.6.2009, 21:34
Цитата(nikitos1980 @  29.6.2009,  19:57 Найти цитируемый пост)
то у меня возрастает объем памяти (не моего процесса, а общей, справа внизу в окне) на 100-150 Мб! Я не пойму почему она растет, все перерыл, нашел что при копировании...

  оська кэширует данные повторяющихся операций для ускорения работы. Это еще что, у меня виста умудряется почти 4Гб Озу выжрать при распаковке больших архивов или при повторной записи больших образов.

Автор: jonie 29.6.2009, 22:42
Цитата

Вижуал студио пишет detected memory leaks, но я как-то не особо беспокоюсь по этому поводу,

ага, это почти как "Милый, у меня задержка два месяца и все тесты что я опробывала дают 2-е полоски, но ты не беспокойся" (вот чувствую меня сейчас тихо возненавидят некоторые дамы тут за аналогии)...
Поверьте мне, то что вам пишет студия - о том стоит беспокоится всегда.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)