Утечка памяти клиента gSOAP C ++ - PullRequest
2 голосов
/ 10 августа 2010

Я прочитал документы gSOAP и увидел упоминания о том, что нужно вызывать soap_destroy (soap) и soap_end (soap) и т. Д., Однако они всегда являются примерами с одним вызовом для объекта службы.Служба, которую я использую, возвращает около 40 КБ текста при каждом вызове.Моя проблема заключается в том, что использование памяти растет линейно примерно на один и тот же размер для каждого запроса.Я добавил soap_destroy (service-> soap) в getWords безрезультатно.Кто-нибудь может указать, какой код очистки отсутствует в этом фрагменте кода?Запрашивающая программа должна работать целыми днями, поэтому я беспокоюсь не о завершении очистки каждого запроса, а о чистоте каждого запроса.

Ниже я опубликовал анагативный пример (проверка без ошибок), основанный на http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=43, (возвращает фрагменты текста, верно?).Любая помощь с благодарностью!

#include "soapBibleWebserviceSoapProxy.h"
#include "BibleWebserviceSoap.nsmap"
#include <iostream>
extern "C" {
#include <unistd.h>
}

struct Service
{
    BibleWebserviceSoap service;

    std::string getWords(std::string &title, int chapter)
    {   
        _ns1__GetBibleWordsByBookTitleAndChapter req;
        _ns1__GetBibleWordsByBookTitleAndChapterResponse resp;
        req.BookTitle = &title;
        req.chapter   = 1;

        service.__ns2__GetBibleWordsByBookTitleAndChapter(&req, &resp);

        return *(resp.GetBibleWordsByBookTitleAndChapterResult);
    }
};

int main(int argc, char* argv[])
{
    Service s;
    std::string genesis("Genesis");
    for (int i=0; i<360; ++i)
    {   
        sleep(2);
        std::cout << s.getWords(genesis,1) << std::endl;
    }
    return 0;
}

1 Ответ

0 голосов
/ 18 августа 2010

Запустите ваше приложение под Valgrind (valgrind.org - обычно устанавливается по умолчанию в Linux) - это самый простой способ отследить утечки памяти.

Сделайте 1000+ звонков и при выключении вы увидите утечку. Если утечка не отображается при выключении, то какой-то список или карта собирает записи, но только выпускает их при выключении - в этом случае используйте Massif (часть Valgrind) - это также отличный инструмент.

Это не прямой ответ, а трассировка стека выделения памяти, которая потребляет память, обычно очень помогает точно определить причину утечки.

...