Speicher freigeben



  • Servus,
    ich habe hier ein Simulationsprogramm, welches ich mit Hilfe von C++ erweitern kann. Diese Schnittstelle stellt mir verschiedene Funktionen zur Verfügung. Eine ist das Speichern von Daten in einem struct

    ///////////////////////////////////////////////////////////
    	// Allocate User Memory
    	struct UD {
    		double pEswIGBT[E_VECTOR];
    	};
    	UD *pData = (UD*)pMod->AllocateUserDataMemory( sizeof( UD ) );
    	pMod->SetUserData( pData, sizeof( UD ) );
    
    	///////////////////////////////////////////////////////////
    	// Init Vektor Werte
    	Esw_Vektor(pMod);
    

    E_VECTOR ist eine Konstante, mit pMod->SetUserData wird Speicher reserviert. Mit Esw_Vektor werden lediglich Werte in pEswIGBT geschrieben. Das funktioniert, hab ich schon ausprobiert.

    struct UD {
    		double pEswIGBT[E_VECTOR];
    	};
    	long UDsize;
    
    	UD *pData = (UD*)pMod->GetUserData( &UDsize );
    

    Mit GetUserData kann man sich den Zeiger auf den zuvor festgelegten Speicher wieder holen. Jetzt kommt die Frage:

    Wenn ich mit GetUserData einen Zeiger hole, dann muss ich den am Ende der Funktion wieder freigeben. Wenn ich das nicht mache, explodiert irgendwann der Speicher und das Programm bricht ab. Wenn ich das mache, dann scheint es, als ob bei jedem Schritt (Simulationsprogramm) Teile des Speichers überschrieben werden.

    Wie kann man das richtig machen ?



  • Naja wenn die Schnittstelle Funktionen zur Verfügung stellt um Speicher zu allokieren sollte sie eigentlich auch Funktionen besitzen, die den Speicher wieder freigeben.
    Desweiteren kann man die Allocate-Funktion und die SetUserData-Funktion eigentlich auch in einem Stück realisieren, aber vermutlich hast du die Funktionen so vorgeben.



  • Das läuft in einer DLL. Deshalb muss man bei jedem Funktionsaufruf erstmal den Zeiger auf die Daten holen.

    Diese Daten sollen erhalten bleiben, aber irgendwas frisst mir den Speicher auf. Und das ... so scheint es ... ist GetUserData.



  • Musst du UDsize selber setzen, oder tut das GetUserData für dich?



  • It0101 schrieb:

    Musst du UDsize selber setzen, oder tut das GetUserData für dich?

    Mich stutzt auch ein wenig das er an der Stelle einen Pointer übergibt. Wenn dieser Pointerwert als Size gewählt wird, dann gute Nacht. 😉



  • UDsize wird von GetUserData gesetzt, deshalb wird das als Zeiger übergeben.


Anmelden zum Antworten