Я пытаюсь освободить память 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 занимает слишком много времени для больших изображений.)
body
. Я не гуру JNI, но вполне возможно, что сборщик мусора сделает это за вас. Не делайтеdelete
вещей, если вы не выделили их или в документации API не указано, что вы несете ответственность за их удаление. Предпочитаю не выделять его в первую очередь. - person user4581301   schedule 31.05.2018ReleaseShortArrayElements
. Опять же, посмотрите подробности на соответствующей странице документации. - person user4581301   schedule 31.05.2018t_data
в первую очередь. (Это потребует большего контекста, чем в вопросе.) - person JaMiT   schedule 31.05.2018free
илиdelete
для указателя, возвращенногоGetShortArrayElements
, потому что вы не знаете, чтоGetShortArrayElements
сделал внутри. Возможно, он вообще не выделил никакой памяти. Некоторые реализации просто закрепляют массив Java, чтобы избежать его перемещения сборщиком мусора, а затем возвращают указатель на фактическое содержимое массива Java. Просто вызовитеReleaseShortArrayElements
, когда закончите с указателем. - person Michael   schedule 31.05.2018