Заранее извиняюсь за длинный пост. Я использую API вызова JNI для использования библиотеки Java. Я обернул код JNI в библиотеку классов C ++. В моем main()
Функция у меня есть следующий цикл:
for(date CURRENT_DATE = START_DATE; CURRENT_DATE.COMPARE_TO(END_DATE) <= 0; CURRENT_DATE.SHIFT_SELF(TIMESTEP))
{
CURRENT_STATE = Propagator.PROPAGATE(CURRENT_DATE); //ISSUES WITH DESTRUCTOR
output::to_OUTPUT_FILE(CURRENT_STATE,"OutputFile.txt");
}
У меня проблема с управлением памятью при попытке освободить локальные ссылки на объекты Java в деструкторе моего state
учебный класс. По существу, ссылка на объект java удаляется и не может использоваться при повторном назначении, когда вызывается оператор назначения копирования.
Чтобы описать это немного подробнее, мой деструктор выглядит примерно так:
state::~state()
{
if(DOES_JVM_EXIST())
{
ENV->DeleteLocalRef(this->jobj_STATE);
}
}
и оператор присваивания:
state& state::operator =(const state& state_to_copy)
{
this->ENV = ENV;
this->jobj_STATE = ENV->AllocObject(this->jcls_STATE);
this->jobj_STATE = state_to_copy.get_STATE_JOBJECT();
return *this;
}
propagator::PROPAGATE()
метод возвращает state
объект:
state propagator::PROPAGATE(date & TargetDate)
{
jobject jobj_PROPAGATED_STATE = ENV->CallObjectMethod(this->jobj_PROPAGATOR, jmid_PROPAGATE, TargetDate.get_DATE_JOBJECT());
state PROPAGATED_STATE(this->ENV);
PROPAGATED_STATE.set_STATE_JOBJECT(jobj_PROPAGATED_STATE);
return PROPAGATED_STATE;
}
Проблема в том, что когда Propagator.PROPAGATE()
возвращается, деструктор вызывается и удаляет ссылку на jobj_PROPAGATED_STATE в JVM. Это означает, что при переназначении CURRENT_STATE
через оператор присваивания копии цикл завершается сбоем, поскольку ссылка на объект задания больше не существует.
Как именно можно попытаться подойти к этой проблеме, чтобы циклы работали, а также чтобы был удален рабочий объект jobj_state?
Задача ещё не решена.
Других решений пока нет …