Заранее извиняюсь за длинный пост. Я использую 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?