Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Утечка памяти (C++ Builder 2006) (https://forum.antichat.xyz/showthread.php?t=182775)

M_script_ 28.02.2010 17:06

Утечка памяти (C++ Builder 2006)
 
При работе программы постоянно увеличивается объем используемой памяти. Происходит это очень медленно, но все же где-то есть утечка. Не могу понять в чем проблема. Ниже код потока. Там где код1 и код2 нет никаких объявлений переменных, только использование методов класса AnsiString (::Pos(), ::Delete(), ::SubString()) и несколько циклов while();

Код:

unsigned long __stdcall work_thr(void*)
{
        FILE* fSave;
        AnsiString sFormat = "file001";
        AnsiString sData = "";
        int iCount = 1000;

        while(!bComplete)
        {
                //тут код1
               
                for(int j = 0; j < iCount; ++j)
                {
                        //тут код2
                       
                        fSave = fopen((sFormat + ".txt").c_str(), "a");
                        if(fSave)
                        {
                                fputs((sData + "\n").c_str(), fSave);
                                fclose(fSave);
                        }
                }
        }
        return 0;
}

В чем может быть проблема?

d_x 28.02.2010 17:12

Если поток создается с помощью CreateThread, то вместо return 0 надо бы использовать ExitThread(0).

M_script_ 28.02.2010 17:20

Цитата:

Сообщение от d_x
Если поток создается с помощью CreateThread, то вместо return 0 надо бы использовать ExitThread(0).

Утечка в цикле while(!bComplete), используемая память увеличивается во время работы, когда все потоки активны.
Но все равно спасибо, поправлю это.

sn0w 02.03.2010 12:41

попробуй обойтись без AnsiString

GhostOnline 02.03.2010 14:24

А ты на все 100% уверен что тут вообще есть утечка?
Я к тому, что когда-то тоже так в ДЗ винды смотрел думал есть утечка в прграмме.
Потом установил тулзу встраивающуюся в код, погонял прогу с нею - утечек не нашлось.
При этом для теста тут же написал код с утечкой - успешно детектировала.
Вообще в ДЗ не так то просто детектировать memory leaks, там не все так очевидно как кажется на первый взгляд.

razb 02.03.2010 14:27

Прогони через valgrind и увидишь в каком месте утечка, да лучше std строки юзать.

desTiny 02.03.2010 18:02

Цитата:

Сообщение от d_x
Если поток создается с помощью CreateThread, то вместо return 0 надо бы использовать ExitThread(0).

зачем?

Gar|k 02.03.2010 20:34

ога d_x Рихтер пишет
Цитата:

Завершение потока
Поток можно завершить четырьмя способами:

- функция потока возвращает управление (рекомендуемый способ);
- поток самоуничтожается вызовом функции ExitThread(нежелательный способ);
- один из потоков данного или стороннего процесса вызывает функцию TerminateThread (нежелательный способ);
- завершается процесс, содержащий данный поток (тоже нежелательно).
В этом разделе мы обсудим перечисленные способы завершения потока, а также рассмотрим, что на самом деле происходит в момент его окончания.

Возврат управления функцией потока
Функцию потока следует проектировать так, чтобы поток завершался только после того, как она возвращает управление. Это единственный способ, гарантирующий корректную очистку всех ресурсов, принадлежавших Вашему потоку. При этом:

- любые С++-объекты, созданные данным потоком, уничтожаются соответствующими деструкторами;
- система корректно освобождает память, которую занимал стек потока;
- система устанавливает код завершения данного потока (поддерживаемый объектом ядра "поток") — его и возвращает Ваша функция потока;
- счетчик пользователей данного объекта ядра "поток" уменьшается на 1.
Функция ExitThread
Поток можно завершить принудительно, вызвав:

VOID ExitThread(DWORD dwExitCode);
При этом освобождаются все ресурсы операционной системы, выделенные данному потоку, но C/C++ - ресурсы (например, объекты, созданные из С++-классов) не очищаются. Именно поэтому лучше возвращать управление из функции потока, чем самому вызывать функцию ExitThread...

GhostOnline 08.03.2010 01:50

Ну что ТС, нашел утечку?

ЗЫ Это не флуд, реально интересно


Время: 12:59