Как освободить память, выделенную с помощью jShortArray / jByteArray из JNI, Java и C ++ - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь освободить память t_data, которая назначена в качестве фиктивной переменной.(Код ниже).Теперь, как только я освобождаю t_data, программа выдает ошибку повреждения кучи, но вместо этого, если я копирую весь материал из тела в новую память для t_data, все работает нормально.Код удаления вызывается где-то внизу строки в другом методе класса (здесь не показан), он просто использует указатель t_Data для удаления памяти.

jshortArray val = (jshortArray)(m_pJVMInstance->m_pEnv->CallStaticObjectMethod(m_imageJ_cls, method_id, arr, (jint)t, (jint)c));
jsize len = m_pJVMInstance->m_pEnv->GetArrayLength(val);
jshort* body = m_pJVMInstance->m_pEnv->GetShortArrayElements(val, 0);       
unsigned short int* dummy = reinterpret_cast<unsigned short int*>(body);
//t_data = dummy; //NOTE: Once you free t_data later exception is thrown.
t_data = new unsigned short int[len];
for (int i = 0; i < len; i++) {
    unsigned short int test = *(body + i);
    *((unsigned short int*)t_data + i) = test;
}

Я пытаюсь найти способ, которым у меня нетзапустить цикл for, чтобы скопировать данные тела в t_data и все еще иметь возможность освободить память.(Цикл for занимает слишком много времени для больших изображений.)

1 Ответ

0 голосов
/ 02 июня 2018

То, что сказал Майкл, было правильно, и это действительно решило проблему.Ссылаясь на его комментарий:

Да, определенно не вызывайте free или delete для указателя, возвращаемого GetShortArrayElements, потому что вы не знаете, что GetShortArrayElements сделал внутренне.Возможно, он вообще не выделил никакой памяти.Некоторые реализации просто закрепляют массив Java, чтобы избежать его перемещения GC, а затем возвращают указатель на фактическое содержимое массива Java.Просто вызовите ReleaseShortArrayElements, когда закончите с указателем.- Майкл

...