Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение закрывается, проблема с 
:(
    Опции темы
jimbo
Дата 24.6.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Здравствуйте!

Написал клиент-серверное приложение под windows XP SP3, на MSVS 6.0. Сервер стоит на windows server 2008 - работает как служба и исправно. Запускаю клиент на Vista Home Basic  - приложение запускается, пара нажатий на кнопочки типа получить данные с сервера и программа закрывается. Сообщение такое:
*.exe не работает
Возникшая проблема привела к прекращению работы программы. Виндоус закроет эту программу, а если есть известный способ устранения проблемы, уведомит вас об этом.

Ладно, фигня.. Ставлю VS6.0. на Висту и дебажу - все отлично работает. запускаю ехе-шник мимо студии и вуаля - опять та же хрень что я написал чуть выше. 

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

Вот код на всякуий случай, получение данных с сервера:
Код


pack* sendQuery(int YYYY1,int MM1,int DD1,int hh1,int mm1,int YYYY2,int MM2,int DD2,int hh2,int mm2,char* name,char* subname,int minutes)
{
    pack A;
    char buf[1024];
    char* str = NULL;
    A.Form2(YYYY1,MM1,DD1,hh1,mm1,
            YYYY2,MM2,DD2,hh2,mm2,
            name,subname,
            minutes);
    int bytesSent;
    bytesSent = send(m_socket,A.ToString(),A.pack_size,0);
    int close=0;
    int numeration = 0;
    int lenofpack=0;
    char ttt[10];
    int first=1;
    int length = 0;
    int index  =0 ;
    char* newstr = NULL;
    for(int i=0;i<1024;i++)
        buf[i]=0;
    do
    {
        bytesSent = recv(m_socket,buf,(int)1024,0);
        if(bytesSent>0)
        {
            index = 0;
            int j=0;
            int size = 1024;
            newstr = new char[size];
            for(int i=0;i<size;i++)
                newstr[i] = buf[i];
            while(0<=(index=FindSubString(newstr,size,"okay")))
            {
                MakesubstringFromString(newstr,size,index,index + (int)strlen("okay"));      //warning str is deleting
                size = size-(int)strlen("okay");
                j++;
            }
            while(j>0) 
            {
                SendMessage(hwndPB,PBM_STEPIT,0,(LPARAM)0);
                SendMessage(hProgressTitle,WM_SETTEXT,0,(LPARAM)"");
                SendMessage(hProgressTitle,WM_SETTEXT,0,(LPARAM)progressenum[numeration]); 
                numeration++;
                j--;
            }
            for(int k=0;k<1024;k++)
                buf[k] =0;
            for(k=0;k<size;k++)
                buf[k]=newstr[k];
            delete []newstr;
            newstr = NULL;
            if(first==1)
            {
                if(buf[1] == buf[3] && buf[3] == '|')
                {
                    int i=0;
                    while(buf[i+4]!='|')
                    {
                        ttt[i] = buf[i+4];
                        i++;
                    }
                    ttt[i]=0;
                    lenofpack = atoi(ttt);
                    str = new char[lenofpack+10+strlen(ttt)];
                    first=0;
                }
            }            
            if(lenofpack>0)
            {
                int i=0;
                while(i<1024)
                {
                    str[length+i] = buf[i];
                    if(buf[i+1]==0)
                    {
                        int j=i+1;
                        while(j<1024)
                        {
                            if(buf[j]!=0) break;
                            j++;
                        }
                        if(j==1024)
                        {
                            if(str[length+i]==53 && str[length+i-1]==53 && str[length+i-2]==50 && str[length+i-3]==124) close =1;
                            i++;
                            break;
                        }
                    }
                    i++;
                }
                str[length+i] = 0;
                length += i;
            }
            for(k=0;k<1024;k++)
                buf[k] =0;
            if(newstr) {delete []newstr;
            newstr = NULL;}
        }
        else close = 1;
        //MessageBox(hWnd,"something come end","",MB_OK);
    }while(close<1);
    if(newstr)
    {
        delete []newstr;
        newstr = NULL;
    }
    pack *ret = new pack();
    if(!str) 
    {
        //delete []str;
        //str = NULL;
        return (pack*)0;
    }    
    if(ret->FillByString(str))
    {
        if(str)
        {
            delete []str;
            str = NULL;
        }
        return ret;
    }
    if(str) {delete []str;str = NULL;}
    return (pack*)0;
}


--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Cheloveck
Дата 24.6.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Код

pack *ret = new pack();
    if(!str) 
    {
        //delete []str;
        //str = NULL;
        return (pack*)0;
    }    
    if(ret->FillByString(str))
    {
        if(str)
        {
            delete []str;
            str = NULL;
        }
        return ret;
    }
    if(str) {delete []str;str = NULL;}
    return (pack*)0;

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


--------------------
user posted image
PM Jabber   Вверх
jimbo
Дата 24.6.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Где именно не проверяю? номер строки коде? единственное, я там не удаляю свой объект класса при невозможном заполнении его строкой. Но я пробовал удалять его при выходе нуля (delete ret;ret = NULL;) - все равно не помогает
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Cheloveck
Дата 24.6.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Код

return ret;

этот ret куда-то возвращается, правильно? Его нужно удалить. Но учитывая, что так же возвращаются и нули, то надо проверить, что удаляешь. Я не вижу кода, который работает с этой функцией, поэтому мне трудно гадать.


--------------------
user posted image
PM Jabber   Вверх
xvr
Дата 25.6.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Возможно переполнение массива ttt
Возможно использование NULL значения из str (она не на всех путях инициализируется) для доступа в память

Поставь на Vista Home твою студию и включи в ней JIT отладчик. При падении программы студия автоматически вызовется и подключится к упавшей проге. Дальше можно будет смотреть, что случилось

PM MAIL   Вверх
jimbo
Дата 25.6.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Он возвращается примерно так:

Код


pack* sendq(...)
{
ret = new pack();
...
return ret;
}


void f()
{
pack* A;
A = sendq(...);
if(A==0)
{
return
}
if(A)
{
}
A->~pack();
}


--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
xvr
Дата 25.6.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Вот это A->~pack(); должно быть delete A; Оригинальный вариант приведет к утечке памяти

PM MAIL   Вверх
MTWizard
Дата 25.6.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.10.2007
Где: Київ

Репутация: 3
Всего: 4



Цитата(jimbo @  24.6.2009,  12:18 Найти цитируемый пост)
pack *ret = new pack();
if(!str)
{
   ...

А зачем эта проверка тут?
PM MAIL   Вверх
Cheloveck
Дата 25.6.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Ну, кроме того, что у тебя деструктор вместо delete ничего не вижу. Очень хороший способ - наставить везде выводов, допустим в файл. Пусть после каждой строчки. После падения посмотреть лог. Там видно будет на чём падает.


--------------------
user posted image
PM Jabber   Вверх
jimbo
Дата 25.6.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Цитата(xvr @ 25.6.2009,  15:36)
Вот это A->~pack(); должно быть delete A; Оригинальный вариант приведет к утечке памяти

почему будет утечка? о_О
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
xvr
Дата 25.6.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(jimbo @ 25.6.2009,  17:30)
Цитата(xvr @ 25.6.2009,  15:36)
Вот это A->~pack(); должно быть delete A; Оригинальный вариант приведет к утечке памяти

почему будет утечка? о_О

Потому что явный вызов деструктора только вызовет деструктор, память, которую выделил new возвращена не будет. Для вызова деструктора и возврата памяти надо звать delete (он для этого и сделан)

PM MAIL   Вверх
jimbo
Дата 26.6.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



А, все, понял почему утечка произойдет))  Спасибо!


Всем так же спасибо за ответы.. я нашел ошибку.. ошибка банальна, в методе toString()  забыл выделить память под '\0':)
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.