Re[2]: Утечка памяти
От: ginger24 Россия  
Дата: 01.03.06 13:24
Оценка:
Здравствуйте, AntonioDev, Вы писали:

AD>Здравствуйте, ginger24, Вы писали:


G>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет

G>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?

AD>Обрати внимание на:

AD>1. Объявление используемых переменных, возможно выделяешь лишнего.
Везде где использую malloc realloc после этого делаю free _NAME
там где new — делаю delete _NAME, открытые файлы закрываю, может быть где то еще неправильно...
Например в конструкции вида if else у меня объявляются переменные, char vv[256], соответственно они только там используются, может быть из-за этого?

AD>2. В циклах, которые крутятся, видимо что то пишешь, вылезая за рамки выделенной памяти.

там два икла, один в другом, первый — на коннект к серверу, если обрывается то просто заново тчо бы соединялся, вида while(true), второй собственно цикл постонного приема данных.

AD>3. Нитями пользуешься?

Да, в зависимости от того какой пришел результат, вот код вызова:

                        int *sleeptime, retval;
                        sleeptime = (int *)malloc(sizeof(int));
                        *sleeptime = timeR-(timeR/10);
                        retval =pthread_create(&tid[0], NULL, sleeping, (void *)sleeptime);
                        if (retval != 0)
                        {
                            log_message("[A] Error, could not create thread");
                        }
#ifdef DEBUG_INFO
                        else
                        {
                            sprintf(logmes, "[D] Next time authorisation remain %i sec of %i.",*sleeptime,timeR);
                            log_message(logmes);
                        }
                        free sleeptime;
#endif


собственно сам процесс:

void *sleeping(void *arg)
{
    int sleep_time = *(int *)arg;
    sleep(sleep_time);
#ifdef DEBUG_INFO
    printf("\n\t[A] Next authorisation %i is awakening!\n", (int)pthread_self());
#endif

    char Buf[LenA];

    Buf[0] = ZTS_Reg_AVTORIZATION;
    int dx=(int) (rand()%256+1); Buf[1] = dx;
    dx=(int) (rand()%256+1); Buf[6] = dx;
    Buf[7] = Enabled_Build;

    *( (unsigned long *)&Buf[2] ) = dA;
#ifdef DEBUG_INFO
    printf("\t\t\t[A] - Buf: %lu", *( (long *)&Buf[2] ));
#endif
    int sendbytes = send(sock,Buf,LenA,0);

    if(sendbytes == -1)
        printf("\t[A] Connect Dropped!\n");
#ifdef DEBUG_INFO
    else
        printf("\t[A] Success! Sent %i bytes of %i!\n",sendbytes, LenA);
#endif
    pthread_exit(NULL);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.