Учитывая это C++ кода:ЮНА Утечка память
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);
}
И это ЮНА Ja:
Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
У меня утечка памяти, как я понимаю, getPointer (0) следует создать указатель объект, который должен быть выпущен на finalize(), но, похоже, этого не происходит.
Я что-то упустил? Это похоже на spec ... и я могу запустить функцию выше, без утечек в C++.
Я вызываю Java-код в цикле, чтобы протестировать утечку, я попытался вставить паузы и вручную вызвать GC, также он быстро раздувается до гигабайтов.
Я уже несколько дней ударяю головой об этом, и это отстойно зависеть от чего-то настолько пустякового, как попытка освободить память. Насколько я могу судить, я могу только вручную освобождать память на Java, если У меня есть адрес, но я не вижу, как это получится.
Edit:
Nevermind, я даже не думаю, что есть способ сделать вручную бесплатно через ЮНА, не расширяя его ...
Это пока работает, но нет ли в JNA другого способа освободить данные? :( – StrangeWill
JNA - это просто оболочка для родной библиотеки. Она не управляет встроенной памятью, в особенности прямым собственным буфером. Задача разработчика собственной библиотеки - предоставить интерфейсы для выделения/освобождения памяти, которую использует библиотека. – ecle
JNA внутренние методы для освобождения памяти, просто странные, что я должен был бы реализовать его снова, потому что все это защищено в JNA. – StrangeWill