Fehler, Irrtümer, Fragen - Seite 2571

 
Was bedeutet die Warnung im Expertenprotokoll, nachdem das Skript beendet ist?
2 leaked strings left

Wie kann dies behoben werden?
Translator übersetzt, zwei durchgesickerte Strings auf der linken Seite. Aber es ist nicht klar, was auf der linken Seite ist, die Schnur?

Das Skript verwendet dieJAson-Bibliothek .
Ein Json-String wird von dll über memcpy_s empfangen, in dll hat dieser String den Typ const wchar_t*
Im #import-Parameter der exportierten Funktion, deklariert alsstring & str, d.h. per Referenz, und string selbst ist alsstring str deklariert;
Dann wird die Zeichenkette str deserialisiert

js.Deserialize(str); 

Das Problem ist genau die Deserialisierung der eingehenden Zeichenkette von memcpy_s.

Denn wenn Sie im Skript einen json-Checkstring erstellen

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

wird die Warnmeldung nicht angezeigt.
Beim Deserialisieren eines Strings aus einer DLL erscheint nach Beendigung des Skripts erneut die Warnmeldung, dass noch 2 Strings ausgelaufen sind

Ich habe versucht, String in Char-Array StringToCharArray zu konvertieren und Char-Array zu deserialisieren.
Aber das Problem bleibt bestehen, und es erscheinen noch 2 undichte Saiten.
Was könnte der Grund dafür sein?

 
Von der DLL habe ich versucht, explizitdie Check-Json-String
L"{\"s\":\"1000\"}"
Die
2 durchgesickerten Zeichenfolgen linksWarnungist verschwunden.
Es stellte sich heraus, dass eine Funktion in der DLL, die Netzwerkdaten liest, dieses Verhalten verursacht.

Aber ich verstehe die Interpretation von
2 durchgesickerten Stringsnicht, was genau bedeutet das undwo kann man weiter suchen?
 
Roman:
Von der DLL habe ich versucht,die Check-Json-String explizit übergeben
Die2 Leaked-Strings linksWarnungist verschwunden.
Es stellte sich heraus, dass die Funktion in der DLL, die Netzwerkdaten liest, dieses Verhalten verursacht.

Aber ich verstehe die Interpretation von
2 durchgesickerten Stringsnicht, was bedeutet das genau undwo kann man weiter suchen?

Wenn man es frei übersetzt, dann: "2 Zeilen verursachen ein Speicherleck".

Wörtlich bedeutet das etwa so viel wie: 2 aktuelle Strings übrig.

 

In der neuesten Version von mt4 im Tester funktionieren die Funktionen iHigh und iTime nicht für Frames oberhalb des täglichen Frames.

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


 
Artyom Trishkin:

Wenn man es frei übersetzt, dann: "2 Zeilen verursachen ein Speicherleck".

Und buchstäblich sieht es so aus: 2 Stromleitungen sind übrig.

Was ist interessant, wenn ich eine Json-Zeichenfolge erhalten und ohne Deserialisierung es ich es in den Kommentar ausgeben, wie es ist, gibt es keine Leckage.
Wenn ich beginnen, es zu deserialisieren, um Json-String-Element zu erhalten, beginnt es undicht.
Es ist nicht klar, ob die Bibliothek undicht ist...

 
Roman:

Was ist interessant, wenn ich eine Json-Zeichenfolge erhalten und ohne Deserialisierung es ich es in den Kommentar ausgeben, wie es ist, gibt es keine Leckage.
Wenn ich deserialisieren, um Json-String-Element zu erhalten beginnen, beginnt es undicht.
Ich weiß nicht, ob die Bibliothek undicht ist...

Es ist undicht. Speicher für Strings wird zugewiesen, Bytes werden kopiert, aber der Speicher wird nicht gelöscht.

Haben Sie den Quellcode?

Hut ab vor den Entwicklern für den Speichermanager, der dies im Auge behält.

 
Vladimir Simakov:

Sie ist undicht. Speicher für Strings wird zugewiesen, Bytes werden kopiert, aber der Speicher wird nicht gelöscht.

Haben Sie den Quellcode?

Ein Lob an die Entwickler für den Speichermanager, der dies im Auge behält.

Die Bibliothek scheint Clear () in der Deserialize-Klassenmethode aufzurufen;

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);
}

Ich habe den Quellcode von hier.

 
Roman:

Die Bibliothek ruft Clear () in der Klassenmethode Deserialize auf;

Der Quellcode wurde von hier übernommen.

Das Leck befindet sich nicht dort, sondern höchstwahrscheinlich in der DLL, von der Sie die Zeichenfolge erhalten.

[Gelöscht]  
Roman:

Es sieht so aus, als ob in der Bibliothek in der Methode der Klasse Deserialize Clear () aufgerufen wird;

Ich habe den Quellcode von hier.

Wie erstellen Sie CJVal? wahrscheinlich new CJVal()?

Das Leck befindet sich nicht dort, sondern höchstwahrscheinlich in der DLL, von der Sie die Zeichenfolge erhalten.

Es ist unwahrscheinlich, dass das Terminal dies mitbekommt.
 
Vladimir Simakov:

Das Leck befindet sich nicht dort, sondern höchstwahrscheinlich in der DLL, von der Sie die Zeichenfolge erhalten.

Ich habe auch den Eindruck, dass die Funktion, die die Daten liest, undicht ist.
Es puffert die Daten zunächst, überträgt sie dann, und nach der Übertragung wird der Puffer gelöscht, so der Entwickler der Lib.
Aber es scheint, dass es einen Fehler bei der Pufferbereinigung gibt.
Aber was interessant ist, wenn wir die Zeichenfolge im Skript nicht deserialisieren, gibt es kein Leck, d.h. das Problem tritt im Moment der Deserialisierung im Skript auf.
Ich prüfe nur verschiedene Varianten möglicher Ursachen.
Leider kein Quellcode, da die .lib geschlossen ist.