Probleme beim Freigeben von Arrays



  • Hallo,

    ich habe ein Problem mit einer DLL...
    Wenn ich den folgenden Code ausführe bekomme ich einen
    AccessViolation Error mit Verweis auf die ntdll.dll

    JNIEXPORT jfloatArray JNICALL Java_dbLib_ReadBinaryFile_getSpectrum
      (JNIEnv *env, jclass jc, jstring file, jlong scan, jint func)
    {
    	//COM-Objekt initialisieren
    	CoInitialize(NULL);
    	IDACSpectrumPtr pSpectrum = IDACSpectrumPtr(CLSID_DACSpectrum);
    
    	//Javastrings parsen
    	const char* c_file = env->GetStringUTFChars(file, 0);
    	jfloatArray outArray;
    
    	//benötigte Variablen
    	VARIANT res;
    	long peaks;
    	float *intensities = 0, *masses = 0;
    
    	//Anzahl der Datenpunkte bestimmen und Array initialisieren
    	peaks = getDataPoints(c_file, func, scan);
    	outArray = env->NewFloatArray((int)peaks*2);
    
    	//Daten lesen
    	pSpectrum->GetSpectrum(c_file, func, 0, scan);
    	pSpectrum->get_Intensities(&res);
    	intensities = getData(res);
    	pSpectrum->get_Masses(&res);
    	masses = getData(res);
    
    	//Daten in ein JavaArray kopieren
    	env->SetFloatArrayRegion(outArray, 0, peaks, intensities);
    	env->SetFloatArrayRegion(outArray, peaks, peaks, masses);
    
    	//Aufräumen
    	env->ReleaseStringUTFChars(file, c_file);
    	delete [] intensities;
    	delete [] masses;
    
    	return outArray;
    }
    
    float* getData(VARIANT in) {
    
    	float HUGEP *out;
    	HRESULT hr = SafeArrayAccessData(
    		in.parray,
    		(void HUGEP**)&out
    	);
    
    	hr = SafeArrayUnaccessData(in.parray);
    
    	return out;
    }
    

    Wenn ich die letzten beiden deletes rausnehme funktioniert es.
    Ich nehme an, es hat etwas mit den SAFEARRAYs zu tuen die im variant stecken...
    Aber ich kenne mich leider nicht gut genug aus... Muss diesen Speicher irgendwie freigeben sonst läuft er ja voll... das selstsame ist, dass
    XP den Code so ausführt... aber win7 will nicht mit den deletes..

    danke schon mal...



  • Da solltest du am besten mal herausfinden, auf welche Weise die getDate()-Funktion den Speicher reserviert, den sie zurückgibt. Deine Freigabe muß dann dazu kompatibel sein.



  • wie genau meinst du das mit auf welche Weise und kompatibel?
    Also wenn man sich die getData Methode anschaut sieht man ja,
    dass die aus dem Variant ein SAFEARRAY holt...
    Hab da auch schon einiges zu gelesen und versucht... aber ich bekomme es
    einfach net freigegeben.



  • Soweit ich die WinAPI richtig verstehe funktioniert das holen und Freigeben mit Hilfe des Paares SafeArrayAccessData/SafeArrayUnaccessData. Du brauchst da also nicht freigeben. Mich irriteirt hier aber eher die SafeArrayUnaccessData in getData.
    Am besten du fragst das mal im WinAPI Forum nach.



  • das komische ist halt, dass mir unter XP der Speicher vollgelaufen is und ich deswegen die zwei Zeilen eingefügt habe und somit das Problem behoben war...
    Welches WinAPI Forum meinst du?



  • Wenn du auf die Forenübersicht gehst siehst du es. Hier noch ein direkter Link.
    http://www.c-plusplus.net/forum/f4


Anmelden zum Antworten