内存溢出?; 当我重复从Java调用(每150毫秒),大约4小时后,我就有一个C++方法(如java java)。内存溢出

内存溢出?; 当我重复从Java调用(每150毫秒),大约4小时后,我就有一个C++方法(如java java)。内存溢出,c++,memory,com,java-native-interface,C++,Memory,Com,Java Native Interface,JNIEXPORT jint JNICALL Java\u nc\u mes\u pub\u hardware\u PCI1761\u readChanel (JNIEnv*,jobject,jint频道){ HRESULT-hr; CLSID-CLSID; hr=CLSIDFromProgID(L“AdvDIO.AdvDIOCtrl”、&clsid); CComPtr advlib; hr=advlib.CoCreateInstance(clsid); 如果(成功(hr)) { advlib

JNIEXPORT jint JNICALL Java\u nc\u mes\u pub\u hardware\u PCI1761\u readChanel (JNIEnv*,jobject,jint频道){

HRESULT-hr;
CLSID-CLSID;
hr=CLSIDFromProgID(L“AdvDIO.AdvDIOCtrl”、&clsid);
CComPtr advlib;
hr=advlib.CoCreateInstance(clsid);
如果(成功(hr))
{ 
advlib->DeviceNumber=0;
如果(advlib->DeviceNumber<0){
返回-100;
}
int i=advlib->ReadDiChannel(通道);
//advlib.Release();
advlib=NULL;
返回i;
}
其他的
{
返回-1;
}

}问题在于这行代码:

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


取消注释
advlib.Release()。但是正确的修复方法是删除
advlib=NULL
并允许
CComPtr
执行其工作。

为什么代码行是//advlib.Release();注释掉??您是否尝试过将该行用作活动代码的函数?是的,这是原始代码。然后内存溢出。所以我对它进行了评论……我认为CComPtr不需要手动释放……删除advlib=NULL;?这样地?int i=advlib->ReadDiChannel(通道);返回i;对的此时,在代码中,
advlib
拥有其包含的值的资源,以便可以释放它们。如果您通过将其设置为
NULL
来销毁它,它将无法释放这些资源,因为它不再包含它们的值。将
advlib
视为“待办事项”列表,列表上有“免费资源”。您将其设置为NULL,删除该列表。因此,它永远不会释放这些资源。
advlib = NULL;