Ошибка памяти при использовании memcpy?

Я использую библиотеку dcmtk для изменения пиксельных данных многокадрового сжатого изображения dicom. Итак, чтобы сделать это, на одном этапе в for цикл Я беру пиксельные данные каждого распакованного кадра и модифицирую их по своему желанию и пытаюсь объединить каждую модифицированную пиксельную информацию в большом буфере памяти кадр за кадром. Этот основной процесс for петля, как показано ниже.

Проблема в том, что после первой итерации она дает память в строке кода, где я вызываю функцию getUncompressedFrame, Я думаю, что это происходит из-за линии memcpy(fullBuffer+(i*sizeF),newBuffer,sizeF);, поскольку, когда я удаляю эту строку, в это время нет ошибки, и весь цикл for работает абсолютно нормально.

Не могли бы вы сказать мне, если я ошибаюсь в работе с memcpy? Благодарю.

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
}

5

Решение

Изменить объявление fullBuffer к этому:

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

Ваш код не выделил массив, он выделил один Uint8 со значением int(sizeF*numOfFrames),

10

Другие решения

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

Это выделяет один байт, давая ему начальное значение sizeF*numOfFrames (после усечения сначала int а затем Uint8). Вы хотите массив, и вы не хотите урезать размер до int:

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

или, чтобы исправить возможные утечки памяти в вашем коде:

std::vector<Uint8> fullBuffer(sizeF*numOfFrames);
3

Если метод getUncompressedFrame выполняет внутренний memcpy для кеширования, тогда имеет смысл, когда вы передаете нулевой указатель в качестве аргумента для кеша без выделения памяти.

0
По вопросам рекламы [email protected]