JNI Freigeben von Speicher, um Speicherleck zu vermeiden

8

So habe ich dieses C ++ - Programm, das über JNI aus meinem Java-Programm aufgerufen wird, folgt der Code:

%Vor%

in dieser vorletzten Zeile jstring newString = env->NewStringUTF((const char*)otherString); wird nie freigegeben, aber zurückgegeben, wird es zu einem eventuellen Speicherverlust führen? Gibt es da irgendwie um das zu umgehen?

Ist es auch möglich, dass ich anstelle einer Zeichenfolge einen booleschen Wert (wie von der LogonUser-Funktion zurückgegeben) anstelle von jstring zurückgeben und stattdessen eine "errormessage" refrence hinzufügen, die in der Methode übergeben wird, und diese aktualisieren? Kann mein Java-Programm ein Update auf "errormessage" sehen?

Danke.

    
Petey B 07.10.2009, 18:32
quelle

2 Antworten

9

NewStringUTF() erzeugt einen neuen java.lang.String - mit anderen Worten, ein Objekt auf dem Java-Heap, das gesammelt wird, wenn es keine Referenzen mehr darauf gibt.

Oder fragen Sie nach otherString ? Ich weiß nicht, was FormatMessage macht, aber es sieht so aus, als würde es Speicher auf dem C-Heap reservieren. Wenn das der Fall ist, dann müssen Sie diesen Speicher explizit freigeben.

Sie erschweren das Leben, indem Sie otherString manchmal auf eine konstante Zeichenkette setzen. Tu das nicht. Rufen Sie stattdessen NewStringUTF() innerhalb der Blöcke Ihres if / else auf und geben Sie im zweiten Fall die native C-Zeichenfolge frei.

    
kdgregory 07.10.2009, 19:11
quelle
6

Sie müssen sich keine Gedanken über den von NewStringUTF zugewiesenen Speicher machen, da dies vom Java-Garbage Collector übernommen wird.

Aber Sie müssen den lpMsgBuf freigeben, wenn Sie FORMAT_MESSAGE_ALLOCATE_BUFFER an FormatMessage übergeben (dh Sie müssen LocalFree verwenden, um diesen Puffer freizugeben), siehe FormatMessage Dokumentation.

    
cmeerw 07.10.2009 20:47
quelle

Tags und Links