为什么用StretchDIBits函数后,回收new出来的堆区,会出现异常呢

为什么用StretchDIBits函数后,回收new出来的堆区,会出现错误呢?
各位大侠,我碰见一个问题,百思不得其解,代码如下:

BITMAPINFO bi;
memset(&bi,  0,  sizeof(bi));
memcpy(&(bi.bmiHeader),  &bih,  sizeof(BITMAPINFOHEADER));

int file_size = nWidth  *  nHeight  *  3;
BYTE *pBmpBuf = new BYTE[file_size];

if (pBmpBuf  !=  NULL)
{
        memcpy(pBmpBuf, pRGB, file_size);
::StretchDIBits(m_memDCDst.GetSafeHdc(),  0,  0,  iRectW,  iRectH,  0,  0,  nWidth,  nHeight,  pBmpBuf,  &bi,  DIB_RGB_COLORS,  SRCCOPY);
}

delete[] pBmpBuf;
pBmpBuf = NULL;

iRectW = iRectH = 200,每次当nWidath = nHeight = 80可以,但当nWidath = nHeight = 82,或是等于74,就不行了。执行完StretchDIBits()后,到delete[] pBmpBuf时会报错,如图:
为什么用StretchDIBits函数后,回收new出来的堆区,会出现异常呢

nWidath 和 nHeight是算法从图像中截取的目标头像尺寸,为什么80就可以,其他的就不行?求各位大神指点。
------解决思路----------------------
nWidth 应该是4的倍数.