2013-08-14 29 views
5

Używam biblioteki dcmtk do modyfikowania danych pikseli skompresowanego obrazu dicom o wielu klatkach. Tak więc, aby to zrobić, w pewnym momencie w pętli for biorę dane pikselowe każdej zdekompresowanej ramki i modyfikuję je zgodnie z moim życzeniem i próbuję połączyć poszczególne zmodyfikowane dane pikseli w dużym buforze pamięci klatka po klatce. Ten podstawowy proces pętli for jest następujący.Błąd pamięci podczas korzystania z memcpy?

Problem jest po pierwszej iteracji, która daje pamięć w wierszu kodu, w którym nazywam funkcję getUncompressedFrame. Myślę, że dzieje się tak z powodu linii memcpy(fullBuffer+(i*sizeF),newBuffer,sizeF);, ponieważ kiedy usuwam tę linię, nie ma w tym czasie błędu, a cała pętla for działa absolutnie dobrze.

Czy możesz mi powiedzieć, jeśli popełniam błąd podczas pracy z memcpy? Dzięki.

Uint32 sizeF=828072;// I just wrote it to show what is the data type. 
Uint8 * fullBuffer = new Uint8(int(sizeF*numOfFrames));//The big memory buffer 
for(int i=0;i<numOfFrames;i++) 
{ 
    Uint8 * buffer = new Uint8[int(sizeF)];//Buffer for each frame 
    Uint8 * newBuffer = new Uint8[int(sizeF)];//Buffer in which the modified frame data is stored 
    DcmFileCache * cache=NULL; 
    OFCondition cond=element->getUncompressedFrame(dataset,i,startFragment,buffer,sizeF,decompressedColorModel,cache); 
    //I get the uncompressed individual frame pixel data 
    if(buffer != NULL) 
    { 
     for(unsigned long y = 0; y < rows; y++) 
     { 
      for(unsigned long x = 0; x < cols; x++) 
      { 
       if(planarConfiguration==0) 
       { 
        if(x>xmin && x<xmax && y>ymin && y<ymax) 
        { 
         index=(x + y + y*(cols-1))*samplePerPixel; 
         if(index<sizeF-2) 
         { 
          newBuffer[index] = 0; 
          newBuffer[index + 1] = 0; 
          newBuffer[index +2] = 0; 
         } 
        } 
        else 
        { 
         index=(x + y + y*(cols-1))*samplePerPixel; 
         if(index<sizeF-2) 
         { 
          newBuffer[index] = buffer[index]; 
          newBuffer[index + 1] = buffer[index + 1]; 
          newBuffer[index + 2] = buffer[index + 2]; 
         } 
        } 
       } 
      } 
     } 
     memcpy(fullBuffer+(i*sizeF),newBuffer,sizeF); 
     //concatenate the modified frame by frame pixel data 
    }     
+0

Run w debugger, jeśli to zatrzymuje się, a następnie bada wartości 'i' i' sizeF', aby sprawdzić, czy wyglądają dobrze. Jeśli to się nie skończy, ustaw punkt przerwania. –

+0

Uruchomiłem debugger, i i sizeF daje odpowiedni numer. Program działa dobrze Nie używam wiersza kodu z memcpy, ale jeśli go użyję, program się zepsuje. –

+0

typ formatu sizeF ?? –

Odpowiedz

10

Zmień deklaracja fullBuffer do tego:

Uint8 * fullBuffer = new Uint8[int(sizeF*numOfFrames)]; 

Twój kod nie przydzielić tablicę, to przydzielony jeden Uint8 z wartością int(sizeF*numOfFrames).

+0

Tak, to był duży wielki błąd, Ah! mój błąd. Dzięki! Spróbuję teraz. Sądzę, że moje oczy mnie oszukały. –

+1

To rozwiązało problem :). ARGH! Cóż za zły los! –

0

Jeśli metoda getUncompressedFrame robi wewnętrzny memcpy do pamięci podręcznej, to ma sens, ponieważ podajesz wskaźnik zerowy jako argument dla pamięci podręcznej, bez przydzielonej pamięci.

3
Uint8 * fullBuffer = new Uint8(int(sizeF*numOfFrames)); 

to przydziela jeden bajt nadanie jej początkowej wartości sizeF*numOfFrames (po obcięcie najpierw do int a następnie Uint8). Chcesz tablicę, a ty nie chcesz obciąć wielkości do int:

Uint8 * fullBuffer = new Uint8[sizeF*numOfFrames]; 
          ^    ^

lub naprawić prawdopodobnych przecieki pamięci w kodzie:

std::vector<Uint8> fullBuffer(sizeF*numOfFrames); 
Powiązane problemy