nicht genug speicher reserviert
-
hallo,
ich habe ein Problem mit einer Funktion, die eine Textur laden soll, in diesem Fall eine unkomprimierte TGA-Datei. Dabei sollen die Bilddaten in ImageData, einem array von GLubyte, gespeichert werden. Die benötigte Größe ist in ImageSize gespeichert.GLubyte* ImageData; size_t ImageSize;Dann soll mit new der benötigte Speicher bereitgestellt werden:
ImageData = new GLubyte[ImageSize];Allerdings ist ImageData vor und nach dieser Zeile nur 4 byte groß, dabei enthält ImageSize einen wesentlich höheren Wert. Wenn ich trotzdem versuche die TGA-Datei einzulesen erhalte ich einen "segmentation fault (core dumped)", was ja auch nicht verwunderlich ist. Allerdings verstehe ich beim besten Willen nicht, warum ImageData nach dem Aufruf von new nicht ImageSize byte groß ist....
Vielen Dank schonmal

-
Hallo
Allerdings ist ImageData vor und nach dieser Zeile nur 4 byte groß
Wenn du das hier ausfürhst
sizeof(ImageData);wirst du immer auf 32-bit System 4 erhalten. Denn ImageData ist ein Pointer und Pointer sind immer gleich groß, egal auf wieviel Speicher sie zeigen.
Du müßtest also schauen wie groß der Speicher ist auf den ImageData zeigt.
Da kannst du allerdings dem Operator new vertrauen. Wenn dein Programm nicht von einer Exception unterbrochen wird (weil nicht mehr genug freier zusammenhängender Speicher da ist) ist in der Tat genau so viel Speicher reserviert wie angegeben.Dein Problem liegt also wo anders. Das werden aber eher die Kenner der Library, die du benutzt, rausfinden.
bis bald
akari
-
Wie hast du denn die Größe abgefragt?
Weil die kannst du garnicht abfragen! das was du wahrscheinlich gemacht hast, ist die Größe des Pointers. Die Größe von ImageData mußt du dir selber irgendwo merken. Aber das hast du ja mit ImageSize indirekt schon gemacht.Wenn du es konfortabler haben willst, würde ich das so machen:
std::vector<GLubyte> ImageData(ImageSize); cout << ImageData.size();
-
ok, dann hatte ich da einen Denkfehler drin.
Aber wenn ich new vertraue und mittels SDL versuche die Bilddaten auszulesen:SDL_RWread(File, &ImageData, ImageSize, 1);erhalte ich den Fehler "segmentation fault (core dumped)". Woran liegt das? Mit derselben Funktion lese ich weiter oben im Code schon den Header der TGA-Datei ohne Probleme aus, warum kommt hier dann ein Fehler?
-
Wie sieht denn die Signatur von SDL_RWread aus? Ich wette du hast den zweiten Parameter falsch übergeben (pointer auf pointer).
-
Wette gewonnen
^^Ok, vielen Dank, ich werde mich wohl mal noch etwas genauer mit Pointern beschäftigen müssen
