Dato questo codice C++:JNA Perdita di memoria
void LoadData(char** myVar)
{
std:: string str("[Really Long String Here]");
unsigned int size = str.length() + 1;
*myVar = new char[size];
strncpy(*myVar, str.c_str(), size);
}
E questo JNA Java:
Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
sto avendo problemi di memoria, se ho capito bene, getPointer (0) dovrebbe creare un puntatore oggetto che dovrebbe essere rilasciato su finalize(), ma sembra non esserlo.
Mi manca qualcosa? Questo sembra su specifica ... e posso eseguire la funzione di cui sopra senza perdite in C++ bene.
Io chiamo il codice Java in un ciclo per testare la perdita, ho provato a mettere in pausa, e manualmente chiamando il GC, inoltre si gonfierà in gigabyte piuttosto rapidamente in questo modo.
Ho sbattuto la testa contro questo per alcuni giorni e mi fa schifo rimanere impiccato a qualcosa di così banale come tentare di liberare memoria. Per quanto posso dire posso liberare solo manualmente la memoria in Java se Ho l'indirizzo, ma non riesco a vedere come lo otterrei.
Edit:
Nevermind, non so nemmeno credo che ci sia un modo per farlo manualmente gratuitamente attraverso JNA senza estenderla ...
Finora sembra funzionare, ma non c'è davvero nessun altro modo in JNA per liberare i dati? :( – StrangeWill
JNA è solo un wrapper per una libreria nativa e non gestisce la memoria nativa, in particolare il buffer nativo diretto.È compito del progettista della libreria nativa fornire interfacce per allocare/deallocare la memoria utilizzata dalla libreria. – ecle
JNA ha metodi interni per liberare memoria, solo strano che dovrei implementarlo di nuovo perché è tutto protetto in JNA. – StrangeWill