内存溢出?

3
我有一个C++方法(适用于Java JNI),如下所示,当我从Java重复调用它(每150毫秒一次)时,大约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;
}

}


为什么代码行 // advlib.Release(); 被注释掉了?你尝试过使用该行作为活动代码来运行函数吗? - mathematician1975
是的,这是原始代码。然后出现了内存溢出问题,所以我将其注释掉了... - suigara
我认为CComPtr不需要手动释放..... - suigara
1个回答

1
问题出在这行代码:
advlib = NULL;

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

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


移除 advlib = NULL;?像这样吗? int i = advlib->ReadDiChannel( channel ); 返回 i; - suigara
正确。在代码的那个点上,advlib 拥有它包含值的资源,以便可以释放它们。如果通过将其设置为 NULL 来销毁它,则它无法释放这些资源,因为它不再包含它们的值。在那一点上,把 advlib 看作是一个“待办事项”列表,其中“释放资源”在列表中。你将其设置为 NULL,擦除了该列表。所以它永远不会释放那些资源。 - David Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接