Frage zu realloc
-
skoll1 schrieb:
Bei den Debugzeilen ist zu sehen, dass die neue Groesse mit 84000000 berechnet wird...
das sind ~80MB. soviel speicher könnte am stück nicht mehr frei sein.
-
skoll1 schrieb:
irgend etwas Verbotenes mit dem Speicher mache, auf den FIRST_GRID_P(l) zeigt? Wuerde realloc das merken und 0 liefern?
Kommt auf die Implementation von malloc() & Co an, aber wenn z.B. ein free() mit dem falschen Pointer erfolgt, hast Du Datensalat, bei dem realloc sehr wohl nur noch NULL- Pointer rückgeben kann.
-
Aber was macht denn realloc? Es versucht doch zunaechst freien Speicher zu bekommen. Wenn das klappt, kopiert es den angegebenen Speicher FIRST_GRID_P(l) da hin. realloc ist doch egal, was in diesem Speicher steht. Koennte FIRST_GRID_P(l) irgendwie "kaputt" gegangen sein. Die Adresse selbst, also worauf FIRST_GRID_P(l) zeigt ist ja noch unmittelbar vor dem realloc Aufruf o.k. wie die DEBUG-Zeilen zeigen. Die Adresse ist ja noch die gleiche, wie beim vorgerigen realloc Aufruf.
-
Was in deinen Daten drinsteht, ist realloc() tatsächlich egal. Aber um deine Daten herum hat der Heap-Manager noch eigene Hilfsdaten verteilt, wo z.B. drinsteht, wie groß der zugehörige Speicherblock ist - und die zu beschädigen könnte üble Folgen habem.
Und pale dog hat recht - 80MB am Stück anzufordern ist eine ganze Menge. Bei diesen Datenmengen solltest du anfangen, dir eine andere Datenstruktur zu überlegen.
-
Wie gesagt, das Programm bearbeitet weit groessere Modelle problemlos und das seit Jahren und auch bei vielen anderen Kollegen hier in der Firma. Der Arbeitsspeicher hier auf unseren Rechnern liegt so bei 2GB aufwaerts. Ich lese mit diesem Programm mehrere FEM-Modelle ein und verbinde sie zu einem. Komisch ist, das wenn ich die Reihenfolge der einzulesenden Modelle aendere, es kein Problem gibt, obwohl die Gesamtgroesse gleich bleibt.
-
Vielleicht hab' ich nur falsch geguckt:
Sag' mal, wie sind denn
FIRST_GRID_P(l) l
usw. typisiert?
-
Kann man sich die groesse des allocierten Memories ausgeben lassen? Also die groesse des allocierten Speichers auf den FIRST_GRID_P(l) zeigt? Dann koennte ich zwischen dem letzten und vorletzten realloc Aufrufen sehen, ob sich da was aendert.
-
skoll1 schrieb:
Kann man sich die groesse des allocierten Memories ausgeben lassen? Also die groesse des allocierten Speichers auf den FIRST_GRID_P(l) zeigt? Dann koennte ich zwischen dem letzten und vorletzten realloc Aufrufen sehen, ob sich da was aendert.
Das ist genau das, was Du angefordert hast, also das Produkt in Bytes.
Wenn's nicht klappt, kriegst Du NULL zurück.
Nachträglich kriegst Du aber nicht raus, wie groß der Mem- Block ist, auf den der Pointer zeigt.
-
Ja aber kann ich unmittelbar vor dem realloc Aufruf abfragen, ob sich die Groesse des Blocks auf den FIRST_GRID_P(l) zeigt seit dem letzten realloc Aufruf veraendert hat (ungewollter Weise).
-
Sorry, hatte die Antwort nicht genau gelesen. Nachtraeglich geht es also nicht mehr.
-
Mache fuer heute Feierabend. besten Dank soweit. Wenn jemandem noch was einfaellt, in welcher Richtung ich weiterforschen kann, waere ich sehr dankbar.
-
Habe den realloc Befehl mal ersetzt durch eine malloc/memcpy Kombination. Und siehe da, ihr hattet recht. Beim malloc gibts Probleme und nicht beim memcpy, d.h. das er tatsaechlich nicht genug zusammenhaengenden Speicher findet. Besten Dank.