gSOAP C ++客户端内存泄漏

时间:2010-08-10 15:10:02

标签: c++ linux memory-leaks client gsoap

我已经阅读了gSOAP文档并看到了一个事实,即应该调用soap_destroy(soap)和soap_end(soap)等,但是它们总是在服务对象上进行单个调用的示例。我正在使用的服务在每次调用时返回大约40KB的文本。我的问题是,对于每个请求,内存使用量线性增长大约相同的大小。我在getWords中添加了soap_destroy(service-> soap)无济于事。任何人都可以指出此代码段中缺少哪些清理代码?请求程序应该连续几天运行,因此每次请求清理是我担心而不是关机。

我在下面发布了一个基于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 :(得分:0)

在Valgrind下运行您的应用程序(valgrind.org - 通常在Linux上默认安装) - 这是追踪内存泄漏的最简单方法。

进行1000多次通话,关机时您会看到泄漏。 如果在关机时没有显示泄漏,那么一些列表或地图会收集条目,但只会在关机时释放它们 - 在这种情况下使用Massif(Valgrind的一部分) - 它也是一个很棒的工具。

这不是一个直接的答案,但是吃掉内存的分配的堆栈跟踪通常有助于指出泄漏的原因。