簡體   English   中英

gSOAP C ++客戶端內存泄漏

[英]gSOAP C++ client memory leak

我已經閱讀了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;
}

在Valgrind(valgrind.org-通常在Linux上默認安裝)下運行應用程序-這是跟蹤內存泄漏的最簡單方法。

進行1,000次以上的通話,關機時您會看到泄漏。 如果在關閉時未顯示泄漏,則某些列表或映射會收集條目,但僅在關閉時釋放它們-在這種情況下,請使用Massif(Valgrind的一部分)-這也是一個很好的工具。

這不是直接的答案,但是占用內存的分配的堆棧跟蹤通常可以在查明泄漏原因方面有很大幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM