损坏的堆栈

corrupted stack

本文关键字:堆栈 损坏      更新时间:2023-10-16

这是我的函数,它显示

变量cinfo周围的堆栈已损坏。

它说问题出现在551行,这是发布代码的最后一行。

struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr       jerr;
FILE*      pOutFile;     //Target file 
int        nSampsPerRow; //Physical row width in image buffer 
JSAMPARRAY jsmpArray;    //Pixel RGB buffer for JPEG file
cinfo.err = jpeg_std_error(&jerr); //Use default error handling (ugly!)
jpeg_create_compress(&cinfo);
if ((pOutFile = fopen(csJpeg, "wb")) == NULL)
{
    *pcsMsg = "Cannot open ";
    *pcsMsg += csJpeg;
    jpeg_destroy_compress(&cinfo);
    return FALSE;
}
jpeg_stdio_dest(&cinfo, pOutFile);
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)hDib;
cinfo.image_width      = lpbi->biWidth;  //Image width and height, in pixels 
cinfo.image_height     = lpbi->biHeight;
cinfo.input_components = 3;              //Color components per pixel
                                         //(RGB_PIXELSIZE - see jmorecfg.h)
cinfo.in_color_space   = JCS_RGB;        //Colorspace of input image
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo,
                 nQuality, //Quality: 0-100 scale
                 TRUE);    //Limit to baseline-JPEG values
jpeg_start_compress(&cinfo, TRUE);
//JSAMPLEs per row in output buffer
nSampsPerRow = cinfo.image_width * cinfo.input_components; 
//Allocate array of pixel RGB values
jsmpArray = (*cinfo.mem->alloc_sarray)
            ((j_common_ptr) &cinfo,
             JPOOL_IMAGE,
             nSampsPerRow,
             cinfo.image_height);
if (DibToSamps(hDib,
               nSampsPerRow,
               cinfo,
               jsmpArray,
               pcsMsg))
{
    //Write the array of scan lines to the JPEG file
    (void)jpeg_write_scanlines(&cinfo,
                               jsmpArray,
                               cinfo.image_height);
}
jpeg_finish_compress(&cinfo); //Always finish
fclose(pOutFile);
jpeg_destroy_compress(&cinfo); //Free resources
if (*pcsMsg != "")
    return FALSE;
else
    return TRUE;
}

堆栈跟踪:>WindowBitmap.exe!CBitmapFile::JpegFromDib(void*hDib,int nQuality,ATL::CStringT>>csJpeg,ATL::CStringT>>*pcsMsg)行551+0x28字节C++

错误消息:运行时检查失败#2-变量"cinfo"周围的堆栈已损坏。pcsMsg定义:CString*pcsMsg

jpeg_destroy_compress(&cinfo);

释放一个自动变量的内存,当cinfo超出作用域时会第二次释放该内存。

函数jpeg_destroy_compress()应解除分配并释放与压缩对象相关的所有内存。