Errori, bug, domande - pagina 2571

 
Cosa significa l'avvertimento del log dell'esperto, dopo che lo script è finito?
2 leaked strings left

Come si può risolvere questo problema?
Il traduttore traduce, due stringhe trapelate a sinistra. Ma non è chiaro, a sinistra di cosa, della corda?

Lo script utilizza la libreriaJAson .
Una stringa Json viene ricevuta dalla dll tramite memcpy_s, nella dll questa stringa ha il tipo const wchar_t*
Nel parametro #import della funzione esportata, dichiarato comestring & str, cioè per riferimento, e la stringa stessa è dichiarata comestringa str;
Poi la stringa str viene deserializzata

js.Deserialize(str); 

Il problema è esattamente la deserializzazione della stringa in arrivo da memcpy_s.

Poiché se si crea una stringa di controllo json nello script

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

il messaggio di avvertimento non appare.
Deserializzando una stringa da dll, il messaggio di avvertimento appare di nuovo dopo la fine dello script, rimangono 2 stringhe trapelate

Ho provato a convertire una stringa in un array di caratteri StringToCharArray e a deserializzare l'array di caratteri.
Ma il problema persiste, e appaiono 2 stringhe perdute.
Quale può essere la ragione di questo?

 
Dalla dll ho provato a passare esplicitamenteil controllo della stringa json
L"{\"s\":\"1000\"}"
L'avviso di
2 stringhe perse rimaste è scomparso.
Si è scoperto che una funzione nella dll che legge i dati di rete causa questo comportamento.

Ma non capisco l'interpretazione delle
2 stringhe trapelate a sinistra, cosa significa esattamente edove scavare ulteriormente?
 
Roman:
Dalla dll, ho provato a passare esplicitamenteil controllo della stringa json
L'avviso di
2 stringhe perse rimaste è scomparso.
Si scopre che la funzione nella dll che legge i dati di rete causa questo comportamento.

Ma non capisco l'interpretazione delle
2 stringhe trapelate a sinistra, cosa significa esattamente edove scavare ulteriormente?

Se tradotto liberamente, allora: "2 linee causano una perdita di memoria".

Letteralmente, significa più o meno questo: 2 stringhe attuali rimaste.

 

nell'ultima build di mt4 nel tester le funzioni iHigh, iTime non funzionano per i frame superiori al daily frame

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


 
Artyom Trishkin:

Se tradotto liberamente, allora: "2 linee causano una perdita di memoria".

E letteralmente, è così: rimangono 2 linee di corrente.

La cosa interessante è che quando ottengo una stringa Json e senza deserializzarla la faccio uscire nel commento, così com'è, non ci sono perdite.
Quando inizio a deserializzare per ottenere l'elemento stringa Json, inizia a perdere.
Non è chiaro, è la biblioteca che perde...

 
Roman:

La cosa interessante è che quando ottengo una stringa Json e senza deserializzarla la faccio uscire nel commento, così com'è, non ci sono perdite.
Quando inizio a deserializzare per ottenere l'elemento stringa Json, inizia a perdere.
Non so se la biblioteca ha delle perdite...

C'è una perdita. La memoria per le stringhe viene allocata, i byte vengono copiati, ma la memoria non viene cancellata.

Hai il codice sorgente?

Complimenti agli sviluppatori per il gestore della memoria per tenere traccia di questo.

 
Vladimir Simakov:

C'è una perdita. La memoria per le stringhe viene allocata, i byte vengono copiati, ma la memoria non viene cancellata.

Avete il codice sorgente?

Complimenti agli sviluppatori per il gestore della memoria per tenere traccia di questo.

La libreria sembra chiamare Clear () nel metodo della classe Deserialize;

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

Ho preso il codice sorgente da qui.

 
Roman:

La libreria chiama Clear () nel metodo della classe Deserialize;

Il codice sorgente è stato preso da qui.

La perdita non è lì, ma molto probabilmente in quella dll, da cui si ottiene la stringa.

 
Roman:

Sembra che nella libreria, nel metodo della classe Deserialize, venga chiamato Clear ();

Ho preso il codice sorgente da qui.

Come si crea CJVal, probabilmente new CJVal()?

La perdita non è lì, ma molto probabilmente in quella dll, da cui si ottiene la stringa.

È improbabile che il terminale lo catturi.
 
Vladimir Simakov:

La perdita non è lì, ma molto probabilmente nella dll da cui si ottiene la stringa.

Ho anche l'impressione che la funzione che legge i dati stia perdendo.
Prima bufferizza i dati, poi li trasferisce, e dopo il trasferimento, il buffer viene cancellato, secondo lo sviluppatore della lib.
Ma sembra che ci sia un bug nella cancellazione del buffer.
Ma ciò che è interessante, se non deserializziamo la stringa nello script, non c'è nessuna perdita, cioè il problema si verifica al momento della deserializzazione nello script.
Sto solo controllando diverse varianti di possibili cause.
Nessun codice sorgente purtroppo, poiché il .lib è chiuso.