Я создал автономный многопоточный веб-сервис с использованием фреймворка g SOAP, но в этом коде есть утечка памяти, и когда я пытаюсь освободить эту память, через какое-то время происходит сбой.
Ниже приведены подробные шаги, которые я выполнил для создание веб-сервиса.
- soapcpp2 -i -S -I Services.h
- скомпилировал код, добавив сгенерированные файлы и 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. Это проблема воспроизводима.
Я не уверен, что вызывает эту проблему, может ли кто-нибудь мне здесь помочь?