2017-06-17 18 views
0

Linuxを実行しているblackfin用に実装されたCクライアントおよびサーバーWebサービスにgsoapを使用しています。gsoap memory leak C applications

アプリケーションではmallocは使用しません。しかし、メモリ使用量は時間の経過と共に上昇することがわかります。呼び出しの最後にsoap_endを使用してクリーンアップを行います。しかし、呼び出しが繰り返し呼び出されるとメモリの使用量が徐々に増加し、メモリの断片化が原因である可能性があります。これはシステムのパフォーマンスにも影響します

soap_mallocがあまり使用されないgsoapの推奨される使用法は何ですか?たとえば:静的配列などを使用すると役立つでしょうか?

おかげで、

NKR

答えて

0

私はその必要がないため、静的データを使用してお勧めしません。

メモリの使用をデバッグするには、すべてのソースファイルを-DDEBUGでコンパイルします。アプリケーションを実行すると次の3つのファイルが表示されます。

  • SENT.logメッセージが
  • RECV.logメッセージが
  • TEST.log

TEST.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_end()続いsoap_destroy()で削除されます。その後、再度割り当てを開始し、再び削除することができ、など

あなたがそうでなければ、これらの呼び出しで削除されるデータを保存したい場合は、使用:今すぐ

soap_unlink(soap, obj); 

objdelete objと後で削除することができます。ただし、soap_destroy()soap_end()の後に、管理対象データを指すobjのすべてのポインタメンバーが無効になっていることに注意してください。したがって、これらのメンバーでsoap_unlink()を起動するか、ポインタがぶら下がる危険があります。

SomeClass *otherobj = soap_dup_SomeClass(NULL, obj); 

これは、アンマネージドヒープ領域にobjを複製:

のgSOAPの新しいクールな機能は、深いコピーを生成し、コーディング時間の膨大な量を保存し、自動的に任意のデータ構造のための機能を削除することです。これは、オブジェクトグラフのサイクルをチェックし、そのようなサイクルを削除して削除の問題を回避するディープコピーです。 soap_dup_SomeClassの最初の引数にNULLの代わりにsoapを使用して、(循環)管理対象オブジェクト全体を別のコンテキストに複製することもできます。深い削除するには、

soap_del_SomeClass(obj); 

これはobjを削除だけでなく、データがそうで、そのメンバーで指され、。

soap_dup_Xsoap_del_X関数を使用するには、soapcpp2をそれぞれオプション-Ec-Edで使用します。

原則として、静的およびスタック割り当てデータは、同様にシリアライズできます。しかし、管理されたヒープを代わりに使用することを検討してください。

これが役に立ちます。