使用memcpy时内存错误?

时间:2013-08-14 13:20:48

标签: c++ dicom

我正在使用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
    }                   

3 个答案:

答案 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来缓存,那么为什么,因为你将空指针作为缓存的参数传递而没有分配内存,这是有道理的。