PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Problem mit memcpy


Corrail
2005-03-24, 15:18:54
Hallo!

Ich hab ein Problem in C++ mit memcpy. Und zwar hab ich folgenden Code:

unsigned char * tmp = new unsigned char[camera_capture.frame_width * camera_capture.frame_height];

memcpy(tmp, (unsigned char*)(camera_capture.dma_ring_buffer + camera_capture.dma_last_buffer *
camera_capture.dma_frame_size), sizeof(unsigned char) * camera_capture.frame_width * camera_capture.frame_height);
delete[] tmp;

Nun passiert aber folgendes: so wie der Code da steht hab ich ein Memory Leak. Kommentiere ich allerdings die memcpy Zeile aus, so passt es.

Woran kann das liegen?
ich verwende GCC 3.4.2

Gnafoo
2005-03-24, 15:30:43
memcpy(tmp, (unsigned char*)(camera_capture.dma_ring_buffer +
camera_capture.dma_last_buffer * camera_capture.dma_frame_size),
sizeof(unsigned char) * camera_capture.frame_width * camera_capture.
frame_height);


Eventuell ein Problem wegen den Pointer-Arithmetics in Bezug auf Parameter 2 ? Ich weiß ja nicht, welcher Datentyp es vor dem Cast war, aber wenn dessen Größe >1 Byte ist, bekommst du vielleicht deshalb Probleme.

Ansonsten fällt mir da gerade nichts auf.

cu DerTod

Corrail
2005-03-25, 02:43:00
memcpy(tmp, (unsigned char*)(camera_capture.dma_ring_buffer +
camera_capture.dma_last_buffer * camera_capture.dma_frame_size),
sizeof(unsigned char) * camera_capture.frame_width * camera_capture.
frame_height);


Eventuell ein Problem wegen den Pointer-Arithmetics in Bezug auf Parameter 2 ? Ich weiß ja nicht, welcher Datentyp es vor dem Cast war, aber wenn dessen Größe >1 Byte ist, bekommst du vielleicht deshalb Probleme.

Ansonsten fällt mir da gerade nichts auf.

cu DerTod

Naja, aber der zweite Parameter sollte ja eigentlich egal sein. Ok, dann kopiere ich halt nicht den Speicher den ich haben will, aber theoritisch dürfte sich nichts ändern.

camera_capture.dma_ring_buffer ist vom Typ unsigned char *
camera_capture.dma_last_buffer und camera_capture.dma_frame_size sind vom Typ int

Gast
2005-03-29, 13:31:04
unsigned char *dma_ring_buffer = new unsigned char[1000*1000];
int frame_width = 640;
int frame_height = 480;
int dma_last_buffer = 50;
int dma_frame_size = 50;
char *ptr;
cout << "los";

for (int i=0; i<100000; i++){
unsigned char *tmp = new unsigned char[frame_width * frame_height];

//ptr = (char *) malloc(100);

memcpy(tmp, (unsigned char*)(dma_ring_buffer + dma_last_buffer *
dma_frame_size), sizeof(unsigned char) * frame_width * frame_height);
delete[] tmp;
}

erzeugt KEINEN leak. Für eine Leak-Variante reicht es, "ptr = (char *) malloc(100);-2 auszukommentieren ;-)

Lg,
Karli

liquid
2005-03-29, 18:28:42
Was sagt dir denn, dass du da ein Memleak hast? Also ich kann beim besten Willen da nichts finden, was ein Leak erzeugen würde. Du machst bestimmt schon vorher den Heap kaputt, der Fehler taucht wahrscheinlich nur später auf.

cya
liquid

Corrail
2005-03-29, 22:17:48
Was sagt dir denn, dass du da ein Memleak hast? Also ich kann beim besten Willen da nichts finden, was ein Leak erzeugen würde. Du machst bestimmt schon vorher den Heap kaputt, der Fehler taucht wahrscheinlich nur später auf.

cya
liquid

top sagte mir, dass es da ein Mem-Leak gibt. ;)

Aber danke, ich hab es schon gefunden. Und zwas war das ganze extrem bizarr. Mal vorweg: es lag NICHT an diesem Source Code (warum ich dann diesen Source Code gepostet hab erklär ich gleich). Ich verwende die libdc1394 und erstelle pro Schleifendurchlauf eine CameraCapture Object, das mir den Buffer verwaltet (camera_capture.dma_ring_buffer). Nur hab ich vergessen dieses CameraCapture Objekt wieder zu zerstören.

Das bizarre daran war allerdings folgendes: solange ich NICHT auf den Buffer vom CameraCapture Objet (camera_capture.dma_ring_buffer) zugegriffen habe (wurscht mit was, memcpy, []-Operator, ...) ist kein Memory Leak entstanden. Da dürfte der Compiler das wegoptimiert haben oder so. Deshalb hab ich auch geglaubt, dass es an memcpy oder so liegt.