我正在使用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
}
答案 0 :(得分:10)
将fullBuffer
的声明更改为:
Uint8 * fullBuffer = new Uint8[int(sizeF*numOfFrames)];
您的代码未分配数组,它分配了一个Uint8
,其值为int(sizeF*numOfFrames)
。
答案 1 :(得分:3)
Uint8 * fullBuffer = new Uint8(int(sizeF*numOfFrames));
这会分配一个字节,初始值为sizeF*numOfFrames
(先将其截断为int
然后再截至Uint8
)。您需要一个数组,并且不希望将大小截断为int
:
Uint8 * fullBuffer = new Uint8[sizeF*numOfFrames];
^ ^
或者,修复代码中可能存在的内存泄漏:
std::vector<Uint8> fullBuffer(sizeF*numOfFrames);
答案 2 :(得分:0)
如果方法 getUncompressedFrame 正在执行内部memcpy来缓存,那么为什么,因为你将空指针作为缓存的参数传递而没有分配内存,这是有道理的。