【问题标题】:Memory overflow?内存溢出?
【发布时间】:2012-06-30 17:04:12
【问题描述】:

我有一个像follow一样的c++方法(用于java,jni),当我从java(每150ms)重复调用这个时,大约在4小时后。内存溢出……

JNIEXPORT jint JNICALL Java_nc_mes_pub_hardware_PCI1761_readChanel (JNIEnv *, jobject, jint 通道){

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();注释掉了??您是否尝试过将该行用作活动代码的功能?
  • 是的,这是原始代码。然后内存溢出。所以我评论它...
  • 我认为 CComPtr 不需要手动释放.....

标签: c++ memory com java-native-interface


【解决方案1】:

问题出在这行代码:

advlib = NULL;

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

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

【讨论】:

  • 删除 advlib = NULL;?像这样? int i =advlib->ReadDiChannel(channel);返回我;
  • 正确。在代码中的那个点,advlib 拥有它所包含的值的资源,以便它可以释放它们。如果通过将其设置为等于NULL 来销毁它,它就无法释放这些资源,因为它不再包含它们的值。此时将advlib 视为“待办事项”列表,列表中包含“免费资源”。您将其设置为 NULL,从而删除该列表。所以它永远不会释放这些资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多