g SOAP многопоточный сервер дает сбой при попытке освободить память - PullRequest
0 голосов
/ 09 июля 2020

Я создал автономный многопоточный веб-сервис с использованием фреймворка g SOAP, но в этом коде есть утечка памяти, и когда я пытаюсь освободить эту память, через какое-то время происходит сбой.

Ниже приведены подробные шаги, которые я выполнил для создание веб-сервиса.

  1. soapcpp2 -i -S -I Services.h
  2. скомпилировал код, добавив сгенерированные файлы и std soap .h / cpp файлы в визуальном studio.

Ниже приведен код, в котором я порождаюсь всякий раз, когда получаю новый запрос.

struct Services
{
    
        abcService* aServver;
        defService* dServer;
        ghiService* gServer;
        jklService* jServer;
}

DWORD WINAPI StartThread(void* lparam)`
{
        
        Services *sp = static_cast<Services*>(lparam);

        if(soap_begin_serve(sp->aServer->soap)){
            soap_send_fault(sp->aServer);
        }
        else if(sp->aServer->dispatch() == SOAP_NO_METHOD)
        {
            soap_copy_stream(sp->dServer,sp->aServer);
            soap_free_stream(sp->aServer);
            if(sp->dServer->dispatch() == SOAP_NO_METHOD)
            {
                soap_copy_stream(sp->gServer,sp->dServer);
                soap_free_stream(sp->dServer);
                if(sp->gServer->dispatch() == SOAP_NO_METHOD)
                {
                    soap_copy_stream(sp->jServer,sp->gServer);
                    soap_free_stream(sp->gServer);

                    if(sp->jServer->dispatch())
                    {
                        soap_send_fault(sp->jServer);
                    }
                   sp->jServer->destroy();
                }
            sp->gServer->destroy();
         }
        sp->dServer->destroy();
    }
    sp->aServer->destroy();
    delete(sp->aServer);    //--->Line 48
    delete(sp->dSever);     //--->Line 49
    delete(sp->gServer);    //--->Line 50
    delete(sp->jServer);    //--->Line 51
    return 0;
}

int main()
{
    abcService aServver;
    defService dServer;
    ghiService gServer;
    jklService jServer;

    aServer.bind(NULL,8090,100);
    Services servv;
    for(;;)
    {
            aServer.accept();

            
            servv.aServver = aServer.copy();   //--->Line no 21
            servv.dServer = dServer.copy();    //--->Line no 22
            servv.gServer = gServer.copy();    //--->Line no 23
            servv.jServer = jServer.copy();    //--->Line no 24

            DWORD Threadid;
            HANDLE handle = CreateThread(NULL,0,StartThread,(void*)&servv,0,&Threadid);
            CloseHandle(handle);
     }
}

Память создается, начиная со строки № 21 по строку 24, и эти объекты передается в поток, порожденный при каждом запросе.

После того, как запрос обрабатывается в порожденном потоке, я пытаюсь удалить эти объекты, начиная со строки № 48. Через некоторое время он начинает случайный сбой в строке № 48. Это проблема воспроизводима.

Я не уверен, что вызывает эту проблему, может ли кто-нибудь мне здесь помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...