unhandled exception bzw. access violation bei MEMCPY
-
Hallo,
ich hätte da noch eine Frage

Und zwar bekomme ich bei dem unten aufgeführten Code leider immer Programmabstürze an der Stelle "memcpy" mit folgender Meldung:Unhandled exception at 0x6af5d57c in Test.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
Bin für jede Hilfe sehr dankbar!
V.K.//.... int i; cRGB24Pixel *pbImgData,**pImgAll; pImgAll = new cRGB24Pixel *[10]; for (i=0;i<10;i++) { //... pbImgData = (cRGB24Pixel*) pActiveBuf->getPtr(); // hier wird ein Bild in pbImgData abgelegt memcpy(pImgAll[i],pbImgData,grabber.getAcqSizeMaxY()*grabber.getAcqSizeMaxX()*sizeof(cRGB24Pixel)); // jenes Bild soll dann in einem Array gespeichert werden, // damit es nicht beim nächsten Durchgang der for-Schleife wieder überschrieben wird } //.... delete pImgAll;
-
pImgAll = new cRGB24Pixel *[10];Du erstellst in dieser Zeile auf einem ZeigerZeiger ein Array aus zeigern, das is zwars chön, aber die Zeigen erstmal nur irgendwohin, und genau dahin will memcpy schreiben, das kann nicht gut gehen. Jedes Arrayelement ist jetzt ein Zeiger und müsste einzelln erstmal mit new noch Speicher zugewiesen bekommen, dementsprechend musst du dann auch am ende mit delete alles Rückwerts abbauen, also erst den Speicher der Zeiger aus dem Array und danach das Array selbst.
Access Violations bedueten im übrigen immer das der Zielort nicht beschrieben werden kann. Und pro Zeigertiefe soltest du eon p als Prefix anhängen, dh also für ZeigerZeiger pp, das macht es etwas übersichtlicher.
-
Hallo.
Danke für die Antwort! Deinen Vorschlag hatte ich zuvor auch schon ausprobiert, sie wie ich es unten aufgeschrieben habe. Leider hat das auch nicht geklappt. An der gleichen Stelle kommt die gleiche Fehlermeldung:
Unhandled exception at 0x0041299e in Test.exe: 0xC0000005: Access violation reading location 0x00000000.
Danke für weitere Hilfe!
V.K.int i; cRGB24Pixel *pbImgData,**ppImgAll; ppImgAll = new cRGB24Pixel *[10]; for (i=0;i<10;i++) { //... ppImgAll[i] = new cRGB24Pixel [grabber.getAcqSizeMaxY()*grabber.getAcqSizeMaxX()]; pbImgData = (cRGB24Pixel*) pActiveBuf->getPtr(); memcpy(ppImgAll[i],pbImgData,grabber.getAcqSizeMaxY()*grabber.getAcqSizeMaxX()*sizeof(cRGB24Pixel)); } for (i=0;i<10;i++) delete[] ppImgAll[i]; delete ppImgAll;EDIT:
Habe den Fehler selber gefunden. Die Werte grabber.getAcqSizeMaxY() und grabber.getAcqSizeMaxX() sind long Werte. Ich habe sie jetzt auf int gecastet und es funktioniert.
-
Da kann ich nur std::vector<T> empfehlen.
Simon
-
Auch
memcpy()wird in C++ sehr selten verwendet. Für solche Sachen gibts die STL mit ihren Containern und Algorithmen wiestd::copy().