Не пойму, что я не так делаю. Вроде бы всё по докам, а вот косяк...
код доставания массива битов такой:
bool CMy1Dlg::TakeScreenData()
{
	CDialog* m_Dlg=this;
	std::vector<BYTE> DATA;
	bool bResult=false;
	CDC* dc=0;
	for(;;)
	{
		DATA.clear();
		RECT dstRect;
		m_Dlg->GetClientRect(&dstRect);
		LONG wid=dstRect.right -dstRect.left+1;
		LONG hig=dstRect.bottom-dstRect.top +1;
		dc=m_Dlg->GetDC();
		BITMAPINFO bi;
		::memset(&bi,0,sizeof(bi));
		bi.bmiHeader.biSize          =sizeof(bi.bmiHeader);
		DWORD dwdLenInBytes=0;
		const CBitmap* bmp=dc->GetCurrentBitmap();
		if(!::GetDIBits(*dc,*bmp,0,0,0,&bi,DIB_RGB_COLORS) && bi.bmiHeader.biBitCount)break;
		
		bi.bmiHeader.biWidth=4;
		bi.bmiHeader.biHeight=4;
		dwdLenInBytes=
		(
			(
				bi.bmiHeader.biWidth*bi.bmiHeader.biBitCount+31
			)
			/32
		)
		*4
		*bi.bmiHeader.biHeight;
		if(!dwdLenInBytes)break;
		DATA.resize(dwdLenInBytes);
		if(DATA.size()<dwdLenInBytes)break;
		DWORD dwdLines=::GetDIBits(
			*dc,*bmp
			,0,bi.bmiHeader.biHeight
			,&DATA[0]
			,&bi
			,DIB_RGB_COLORS);
		bResult=true;
		break;
	}
	
	if(dc)m_Dlg->ReleaseDC(dc);
	return bResult;
}
далее. Вот скрины из дебажного режима
1 - до чтения битового массива
2 - после
на первом в просмотрщике памяти содержимое переменной bi выделено серым. 8 байтов со значением 0xcc - это дебажный маячок на порчу памяти, он не должен быть затронут.
Но смотрим на скрин 2
0x00ff0000 - нормально, на месте,  а вот 8 байтов 0xcc затёрты {00 ff 00 00 ff 00 00 00}
и я не понимаю, почему! Дебаггер то просто ругается, а релиз падает...
Если сделать финт ушами, а именно: объявить массив из двух BITMAPINFO, но работать только с первым, то лишней затирки, естественно, не будет (испортится второй , неиспользуемый, элемент). Но это костыль.
Всё-таки хочется узнать, в чём причина то