エラー、バグ、質問 - ページ 2571

 
スクリプト終了後のエキスパートログの警告はどのような意味ですか?
2 leaked strings left

これはどうしたら直るのでしょうか?
翻訳者が訳すと、左の文字列が2つ漏れている。しかし、左側が何なのかがはっきりしない、文字列?

このスクリプトは、JAson ライブラリを使用しています。
Json 文字列は memcpy_s を介して dll から受け取られ、dll ではこの文字列は const wchar_t* 型である。
エクスポートされる関数の#importパラメータでは、参照によって文字列&strとして宣言され、文字列自体は文字列 strとして宣言されています。
そして、文字列 str はデシリアライズされます

js.Deserialize(str); 

問題は、まさにmemcpy_sから入力される文字列のデシリアライゼーションです。

スクリプトでjsonのチェック文字列を作成した場合なので

string str = "{\"s\":\"1000\"}";

という警告メッセージが表示されない。
dllから文字列をデシリアライズすると、スクリプト終了後に再び警告メッセージが表示される、リークした文字列は残り2個

文字列を文字列配列StringToCharArrayに変換し、文字列配列をデシリアライズしてみました。
しかし、問題は解決せず、残り2本のリークストリングが出現。
その理由は何でしょうか。

 
dllから、明示的にcheck json string
L"{\"s\":\"1000\"}"
The
2 leaked strings leftwarningが消えました
ネットワークデータを読み込むDLL内の関数がこの動作を引き起こすことが判明しました。

しかし
流出した弦が残り2という解釈が よくわからないのですが、具体的に どういうことなのか、さらにどこを掘 ればいいのでしょうか?
 
Roman:
dllから、明示的にcheck json stringを渡してみた
漏れた文字列が2 つ残っている警告は 消えました。
ネットワークデータを読み込むDLL内の関数がそのような挙動を引き起こすことが判明しました。

しかし
流出した弦が残り2という解釈が よくわからないのですが、具体的に どういうことで、さらにどこを 掘ればいいのでしょうか?

緩やかに訳すなら。"2行でメモリリークを起こす"。

文字通り、「現在の文字列が残り2本」という程度の意味です。

 

mt4の最新ビルドのテスターでは、iHigh,iTime関数が 日足より上のフレームでは動作しない。

iHigh(NULL,PERIOD_W1,0) = 0
iTime(NULL,PERIOD_W1,0) = NULL


 
Artyom Trishkin:

緩やかに訳すなら。"2行でメモリリークを起こす"。

そして文字通り、現在の2行が残っている、という感じです。

面白いのは、Jsonの文字列を取得して、デシリアライズせずにそのままコメントに出力すると、漏れがないことです。
それをデシリアライズしてJson文字列要素を取得し始めると、リークが始まる。
図書館から漏れているのか、はっきりしない...。

 
Roman:

面白いのは、Jsonの文字列を取得して、デシリアライズせずにそのままコメントに出力すると、漏れがないことです。
Jsonの文字列要素を取得するためにデシリアライズを開始すると、リークし始めます。
図書館から漏れたりしないかな...。

漏れている文字列のメモリが 確保され、バイトがコピーされるが、メモリはクリアされない。

ソースコードをお持ちですか?

これを記録するメモリーマネージャーを開発した開発者に拍手です。

 
Vladimir Simakov:

漏れている。文字列のメモリが確保され、バイトがコピーされるが、メモリはクリアされない。

ソースコードはありますか?

これを把握するメモリーマネージャーを開発した開発者に拍手を送りたい。

ライブラリはDeserializeクラスのメソッドでClear()を呼び出しているようです。

virtual bool Deserialize (string js, int acp = CP_ACP)
{
   int i = 0;
   Clear ();
   CJAVal::code_page = acp;
   char arr [];
   int slen = StringToCharArray (js, arr, 0, WHOLE_ARRAY, CJAVal::code_page);
   return Deserialize (arr, slen, i);
}

ソースコードはここから 入手しました。

 
Roman:

ライブラリはDeserializeクラスのメソッドでClear()を呼び出します。

ソースコードはここから 引用しました。

リークはそこではなく、そのDLLにあり、そこから文字列を取得している可能性が高いです。

削除済み  
Roman:

ライブラリの中で、Deserializeクラスのメソッドの中で、Clear()が呼ばれているようです。

ソースコードはここから 入手しました。

CJValはどのように作成するのですか? おそらく、新しいCJVal()でしょう?

リークはそこではなく、そのDLLにあり、そこから文字列を取得している可能性が高いです。

端末がこれをキャッチすることはまずない。
 
Vladimir Simakov:

リークはそこではなく、文字列を取得するDLLにある可能性が高いです。

また、データを読み出す関数が漏れている印象もあります。
最初にデータをバッファリングしてから転送し、転送後はバッファをクリアする、とlibの開発元は言っている。
しかし、バッファークリアーにバグがあるようです。
しかし、興味深いことに、スクリプト内で文字列をデシリアライズしなければ、リークは発生しない。つまり、問題はスクリプト内でデシリアライズした瞬間に発生するのだ。
ただ、考えられる原因について、さまざまなバリエーションを確認しています。
.libは閉鎖されているため、残念ながらソースコードはありません