我有一个c方法(对于java,jni)喜欢跟随,当我重复从java(每150ms)调用这个,大约4小时后 . 内存溢出....
JNIEXPORT jint JNICALL Java_nc_mes_pub_hardware_PCI1761_readChanel(JNIEnv *,jobject,jint channel){
HRESULT hr ;
CLSID clsid;
hr = CLSIDFromProgID(L"AdvDIO.AdvDIOCtrl", &clsid);
CComPtr<IAdvDIO> advlib;
hr = advlib.CoCreateInstance(clsid);
if ( SUCCEEDED( hr ) )
{
advlib->DeviceNumber = 0;
if(advlib->DeviceNumber < 0){
return -100;
}
int i =advlib->ReadDiChannel( channel );
// advlib.Release();
advlib = NULL;
return i;
}
else
{
return -1;
}
}
1 回答
问题是这行代码:
advlib
对象需要正确的值才能完成其工作 . 通过销毁其值并将其设置为NULL,它无法再释放正确的实例 .取消注释
advlib.Release()
可能会使其有效 . 但正确的解决方法是删除advlib = NULL;
并允许CComPtr
完成其工作 .