2017-06-17 160 views
0

我們對運行Linux的blackfin實施的C客戶端和服務器web服務使用gsoap。gsoap內存泄漏C應用程序

我們不在應用程序中使用任何malloc。但是我們發現內存使用量會隨着時間的推移而增加我們正在使用soap_end在通話結束時進行清理。但是當調用重複調用內存時,使用率會慢慢增加,可能是因爲內存碎片。這也影響系統的性能

gsoap的優選用法是什麼,其中soap_malloc用得不多。例如:如果我們使用靜態數組等,它會幫助嗎?

感謝,

NKR

回答

0

我不建議使用靜態數據,也沒有必要。

要調試內存使用,請使用-DDEBUG編譯所有源文件。當你運行你的應用程序,你會看到三個文件:

  • SENT.log消息發送接收
  • TEST.log調試日誌

TEST.log是有用的檢查消息的問題

  • RECV.log消息。

    在運行時生成的其他有價值的信息是與代碼中損壞的內存泄漏或堆內存有關的錯誤消息(例如超出限制)。這種情況在gSOAP引擎中不太可能發生,但更好的檢查。

    爲了確保管理的數據的合理分配和釋放:

    soap_destroy(soap); 
    soap_end(soap); 
    

    我使用的是自動生成的功能來分配管理的數據:

    SomeClass *obj = soap_new_SomeClass(soap); 
    

    和偶爾使用soap_malloc爲原料管理分配,或分配一組指針或C字符串:

    const char *s = soap_malloc(soap, 100); 
    

    但更好是與分配字符串:

    std::string *s = soap_new_std__string(soap); 
    

    和陣列可以與該第二參數,例如被分配10串的數組:

    std::string *s = soap_new_std__string(soap, 10); 
    

    所有被管理的分配與soap_destroy()隨後soap_end()刪除。

    soap_unlink(soap, obj); 
    

    現在obj以後可以用delete obj刪除:在此之後,你可以,如果要保留,否則被這些電話被刪除的數據,使用重新開始分配和再刪除等

    。但請注意,指向託管數據的obj中的所有指針成員在soap_destroy()soap_end()之後都變爲無效。所以你可能不得不在這些成員上調用soap_unlink()或者冒着懸掛指針的風險。

    gSOAP的一種新的酷的功能是產生深拷貝和用於自動任何數據結構,從而節省的編碼時間量巨大刪除功能:

    SomeClass *otherobj = soap_dup_SomeClass(NULL, obj); 
    

    此複製obj非託管堆空間。這是一個深層副本,用於檢查對象圖中的週期並刪除這些週期以避免刪除問題。您還可以使用soap(而不是NULL)爲第一個參數soap_dup_SomeClass複製整個(循環)管理對象到另一個上下文。

    深刪除:

    soap_del_SomeClass(obj); 
    

    這將刪除obj而且數據由它的成員指出,等等。

    要使用soap_dup_Xsoap_del_X函數分別使用帶有選項-Ec-Ed的soapcpp2。

    原則上,靜態和堆棧分配數據也可以串行化。但考慮使用託管堆代替。

    希望這會有所幫助。