Dado este código C++:JNA pérdida de 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);
}
Y esto Java JNA:
Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
estoy teniendo pérdidas de memoria, tal como lo entiendo, GetPointer (0) debe crear un puntero objeto que debería liberarse en finalize(), pero parece no serlo.
¿Echo de menos algo? Esto parece estar a la altura de las especificaciones ... y puedo ejecutar la función anterior sin fugas en C++ bien.
Llamo el código de Java en un bucle para probar la fuga, he intentado poner pausas, y llamar manualmente al GC, también se hincha a gigabytes bastante rápido de esta manera.
He estado golpeando mi cabeza contra esto durante unos días y le apetece colgarse de algo tan trivial como intentar liberar memoria. Hasta donde puedo decir, solo puedo liberar memoria manualmente en Java si Tengo la dirección, pero no veo cómo podría obtener eso.
Editar:
No importa, ni siquiera creo que hay una manera de hacerlo libre de forma manual a través JNA sin extenderlo ...
Esto hasta ahora parece funcionar, pero ¿realmente no hay otra manera en JNA de liberar datos? :( – StrangeWill
JNA es solo un contenedor de una biblioteca nativa. No administra la memoria nativa, especialmente el búfer nativo directo. Es la tarea del diseñador de la biblioteca nativa proporcionar interfaces para asignar/desasignar la memoria que usa la biblioteca. – ecle
JNA tiene métodos internos para liberar memoria, simplemente es extraño que tenga que implementarlo de nuevo porque está todo protegido en JNA. – StrangeWill