Dynamische Speicherverwaltung

rainer82

Grünschnabel
Hallo Gurus,

Ich habe eine Anwendung die sich Pixelinformationen aus einem Bild ausliest. Die Pixelwerte werden in ein Array abgelegt. Da verschiedene Bildformate eingelesen werden, muss ich das ganze dynamisch halten. Das mache ich natuerlich mit dem new Operator. Loeschen tue ich den Heap-Speicherbereich wieder mit delete[].
Nur wie sieht es aus wenn ich mein Array an verschiedene Funktionen uebergeben moechte? Wie verhaelt es sich mit Funktionen, die das Array als Argument haben, mit ihnen was machen und es wieder zurueck geben muessen.

Natuerlich ist es nicht das Array das ich uebergebe sondern ein Pointer der auf die erste Stelle des Arrays verweist.

Mein Programm, loest nach einer Weile immer eine Exception "Out of Memory" aus. Da mach ich wohl etwas falsch mit der Speicherverwaltung. Nur was?
Code:
void FindROI(uchar* pixData,int width,int height)
{
	pixData=new uchar[width*height];
	
	pixData=DoSomething(pixData,width,height);
	pixData=DoSomethingMore(pixData,width,height);
	.
	.
	.
	delete[] pixData;
}
FindROI(...) durchlauft eine Schleife und wird je nach Anzahl der Bilder entsprechend of aufgerufen. Die Aufruferfunktion loescht die Pixelarrays auch entsprechend.

Haenge nun schon ein Weilchen fast und fuer eine eine Erleuchtung sehr dankbar.

Gruss Rainer
 
Hi.

Du überschreibst das Argument pixData mit einer neuen Adresse / neuem Speicher. Wie willst du denn dann noch auf die Daten zugreifen?

Warum geben die Funktionen das Array noch zurück? Die arbeiten doch auf den Originaldaten, Veränderungen wirken sich also direkt aus - oder was passiert in den DoSomethingXXX Funktionen?

Gruß
 
Hi,

vielen Dank erst mal! Ja, du hast recht, ich ueberschreibe das Array. Das mache ich aber bewusst. Eine Funktion z.B. Filtert das Bild (Pixelwerte). Das Resultat der Filterung lege ich wiederum in das Ursprungsarray. Die darauf folgende Funktion wandelt das Bild in ein Binaerbild um usw. Ich versuche es nun mal mit einem globalem Array. Macht es vielleicht etwas einfacher.
 
Deine Funktion ist durch dein Überschreiben aber im Endeffekt sinnlos.
Du übergibst ein Array mit Farbwerten von den einzelnen Pixeln, änderst es nicht und übergibst es auch nicht an eine andere Funktion.
Stattdessen rufst du DoSomething mit vollkommen wirren Pixelwerten auf, die sicher kein sinnvolles Bild ergeben?

Deine FindROI-Funktion ändert jedenfalls überhaupt nichts am Bild.
 
hi,

meine Funktion FindROI (Find Region Of Interest), definiert in meiner Klasse CROI, wird direkt von meiner MFC Dialog Routine aufgerufen. Ich habe dies so angelegt, da ich eine gewisse Uebersichtlichkeit in meinem Programm haben moechte. In der Funktion FindROI werden alle noetigen Operationen (FFT 2D, Filterung im Frequenzbereich, Ruecktransformation, Umwandlung in Binaerbild, morphologische Operationen... ), die in einer weiteren CProcessor Klasse abgelegt sind, aufgerufen. Die Pixel werden also staendig bearbeitet. Quasi als Eingangsdaten behandelt. Die Eingangsdaten werden manipuliert in den Prozessorfunktionen und dann zurueck gegeben und ueberschrieben.
Ich habe kaum programmiert und bringe mir so gut es geht alles selbst und natuerlich mit eurer Hilfe, bei. Lasst mich wissen, ob ihr dass auch so machen wuerdet. Ich meine, man sollte nicht alles in der Dialog Klasse rein knallen, sondern eine Strucktur im Programm aufbauen.
Jedenfalls habe ich meinen "Heap-Fresser" ausfindig gemacht. Hatte ein temporaeres Array in meiner Prozessor Klasse erzeugt (new operator), es aber nicht wieder geloescht (delete[]).
Hab auch schon was von auto_ptr gelesen. Vielleicht sollte ich auf diese umsteigen. Scheint eienem das Leben etwas einfacher zu machen.

Gruss Rainer
 
Ah ja, sorry da ist mir ein Fehler unterlaufen. Die Zeile existiert in meinem Orginalcode gar nicht. War etwas zu speat oder zu frueh als ich den Eintrag geschrieben habe.
 
Zurück