Препълване на паметта?

имам 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;
}

}


person suigara    schedule 29.06.2012    source източник
comment
Защо редът с код // advlib.Release(); коментиран ?? Опитахте ли вашата функция с този ред, използван като активен код?   -  person mathematician1975    schedule 29.06.2012
comment
да, това е първоначалният код. Тогава препълване на паметта. затова го коментирам...   -  person suigara    schedule 29.06.2012
comment
мисля, че CComPtr не трябва да се освобождава ръчно.....   -  person suigara    schedule 29.06.2012


Отговори (1)


Проблемът е този ред код:

advlib = NULL;

Обектът advlib се нуждае от правилната стойност, за да върши работата си. Като унищожи стойността му и го зададе на NULL, той вече не може да освободи правилния екземпляр.

Разкоментирането на advlib.Release() вероятно ще го накара да работи. Но правилното решение е да премахнете
advlib = NULL; и да позволите на CComPtr да си свърши работата.

person David Schwartz    schedule 29.06.2012
comment
премахнете advlib = NULL;? като този? int i =advlib-›ReadDiChannel( канал); връщане i; - person suigara; 29.06.2012
comment
Правилно. В този момент от кода advlib притежава ресурси, чиито стойности съдържа, така че да може да ги освободи. Ако го унищожите, като го зададете равен на NULL, той не може да освободи тези ресурси, защото вече не съдържа техните стойности. Мислете за advlib в този момент като за списък със ЗАДАЧИ с безплатни ресурси в списъка. Задавате го равно на NULL, изтривайки този списък. Така че никога не освобождава тези ресурси. - person David Schwartz; 29.06.2012