free () Anruf funktioniert am Simulator, macht iPad wütend. iPad zerschlagen

8

Meine App hat nicht mehr genügend Speicherplatz. Um dies zu beheben, gebe ich zwei sehr große Arrays frei, die in einer Funktion verwendet werden, die einen Framebuffer in ein Bild schreibt. Die Methode sieht folgendermaßen aus:

%Vor%

Beachten Sie, dass die beiden am Ende frei (Puffer) und frei (Puffer2) sind? Diese funktionieren gut auf dem iPad-Simulator, entfernen das Speicherproblem und erlauben mir, mit Unverschämtheit zu erzeugen. Sie töten jedoch sofort das iPad. Wie zum ersten Mal es es ausführt. Wenn ich die free () -Aufrufe lösche, läuft alles gut, nach ein oder zwei Minuten ist der Speicher knapp. Warum bricht der free () Aufruf das Gerät ab?

Hinweis - es ist nicht der Aufruf von free (), der das Gerät explizit abstürzt, es stürzt später ab. Aber das scheint die Ursache zu sein /..

EDIT - Jemand hat gefragt, wo es genau abstürzt. Dieser Ablauf wird fortgesetzt, um das Bild an ein anderes Objekt zurückzugeben, das es in eine Datei schreibt. Beim Aufruf der Methode 'UIImageJPEGRepresentation' wird eine EXT_BAD_ACCESS-Nachricht generiert. Ich nehme an, dies liegt daran, dass die UIImage, die ich übergebe, um in die Datei zu schreiben, beschädigt, null oder etwas anderes ist. Aber das passiert nur, wenn ich diese beiden Puffer frei mache.

Ich würde verstehen, wenn der Speicher irgendwie mit der UIIMage zusammenhängt, aber das sollte wirklich nicht sein, besonders da es am Simulator funktioniert. Ich fragte mich, ob es darauf ankommt, wie das iPad "freie" Anrufe behandelt ...

    
mtrc 23.07.2010, 11:33
quelle

3 Antworten

8

Aus dem Lesen der docs , ich glaube, dass CGDataProviderCreateWithData den Speicher, auf den puffer2 zeigt, nur referenziert , kopiert ihn nicht. Sie sollten es zugewiesen halten, bis das Bild freigegeben wird.

Versuchen Sie Folgendes:

%Vor%     
Krumelur 23.07.2010, 12:03
quelle
1

Zuerst sollten Sie überprüfen, ob malloc fehlgeschlagen ist und NULL zurückgegeben haben. Wenn dies jedoch Ihr Problem nicht löst, verwenden Sie einen Debugger und durchlaufen Sie Ihr Programm, um genau zu sehen, wo es fehlschlägt (oder zumindest eine Stack-Trace erhalten). Aus meiner Erfahrung sind seltsame Fehler wie der Absturz irgendwo in unerwarteten Bereichen fast immer Pufferüberläufe, die willkürliche Daten beschädigen.

    
RWS 23.07.2010 11:50
quelle
0

Puffer sind unterdimensioniert? Schau dir die Schleifen an.

%Vor%

sei y == 0 und x == (768 * 4) -1, der Index von buffer2 überschreitet die zugewiesene Größe. Wahrscheinlich außerhalb der Reichweite davor?

    
Bruce 23.07.2010 17:32
quelle