5

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
    }                   
4

3 に答える 3

10

の宣言を次のように変更fullBufferします。

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

あなたのコードは配列を割り当てませんでした。Uint8値を持つシングルを割り当てましたint(sizeF*numOfFrames)

于 2013-08-14T13:28:50.370 に答える
3
Uint8 * fullBuffer = new Uint8(int(sizeF*numOfFrames));

これは 1 バイトを割り当て、(最初に に切り捨て、次に にsizeF*numOfFrames切り捨てた後)の初期値を与えます。配列が必要で、サイズを切り捨てたくない:intUint8int

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

または、コード内で発生する可能性のあるメモリ リークを修正するには、次のようにします。

std::vector<Uint8> fullBuffer(sizeF*numOfFrames);
于 2013-08-14T13:31:20.177 に答える
0

メソッドgetUncompressedFrameがキャッシュに対して内部 memcpy を実行している場合、メモリが割り当てられていない状態でキャッシュの引数として null ポインターを渡しているため、その理由は理にかなっています。

于 2013-08-14T13:30:34.897 に答える