提前道歉。我正在使用JNI调用API来利用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");
}
我遇到的问题与内存管理有关,该内存管理试图在我的state
类的析构函数中释放对Java对象的本地引用。本质上,对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()
返回时,析构函数将被调用并删除对JVM中对jobj_PROPAGATED_STATE的引用。这意味着,当通过复制分配操作符重新分配CURRENT_STATE
时,循环将失败,因为对Jobject的引用不再存在。
人们将如何尝试解决该问题,以使循环正常工作,同时又删除jobj_state jobject?