5

我正在使用 dcmtk 库来修改多帧压缩 dicom 图像的像素数据。因此,要做到这一点,在for循环的一个阶段,我获取每个解压缩帧的像素数据并根据我的意愿对其进行修改,并尝试将每个修改像素数据逐帧连接到一个大内存缓冲区中。这个循环的核心过程for如下。

问题是在第一次迭代之后,它在我调用函数的代码行提供了内存getUncompressedFrame。我认为这是因为 line 发生的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
    }                   
4

3 回答 3

10

将声明更改为fullBuffer

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

您的代码没有分配数组,而是分配了一个Uint8带有 value的数组int(sizeF*numOfFrames)

于 2013-08-14T13:28:50.370 回答
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);
于 2013-08-14T13:31:20.177 回答
0

如果方法getUncompressedFrame正在执行内部 memcpy 缓存,那么这是有道理的,因为您将空指针作为缓存的参数传递,而没有分配内存。

于 2013-08-14T13:30:34.897 回答