内存溢出?

我有一个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)

2 years ago

问题是这行代码:

advlib = NULL;

advlib 对象需要正确的值才能完成其工作 . 通过销毁其值并将其设置为NULL,它无法再释放正确的实例 .

取消注释 advlib.Release() 可能会使其有效 . 但正确的解决方法是删除
advlib = NULL; 并允许 CComPtr 完成其工作 .