NEW 问题 高手 留步
UINT * GetPix(CDC *pDC,char * FileName)
{
HBITMAP hbmp=(HBITMAP)LoadImage(NULL,FileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
CBitmap cbmp;
cbmp.Attach(hbmp);
BITMAP bmp;
cbmp.GetBitmap(&bmp);
cbmp.Detach();
UINT * pData = new UINT[bmp.bmWidth * bmp.bmHeight];
BITMAPINFO bmpInfo;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = bmp.bmWidth;
bmpInfo.bmiHeader.biHeight = -bmp.bmHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biBitCount = 32;
GetDIBits(pDC->m_hDC,hbmp,0,bmp.bmHeight,pData,&bmpInfo,DIB_RGB_COLORS);
UINT color, r, g, b;
for(int i = 0; i < bmp.bmWidth * bmp.bmHeight; i ++)
{
color = pData[i];
b = color << 8 >> 24;
g = color << 16 >> 24;
r = color << 24 >> 24;
//note that infact, the r is Blue, b = Red,
r = 0; //mask the blue bits
pData[i] = RGB(r, g, b);
}
return pData;
}
void Screen(char filename[],char filename_lat[])
{
UINT * pData_1 = new UINT[1280*1024]; //1680*1050
pData_1=GetPix(pDC,filename);
for(int i=0;i<1280*1024;i+=100000)
cout<<pData_1[i]<<" ";
delete[] pData_1;
UINT * pData_2 = new UINT[1280*1024];
//cout<<endl;(如果没有这个endl的话程序就会出错)
pData_2=GetPix(pDC,filename_lat);
for(int i=0;i<1280*1024;i+=100000)
cout<<pData_2[i]<<" ";
delete[] pData_2;
}
这里 有两个问题 :第一就是 如果没有cout<<endl;这一句的话 程序会在这里出错,为什么没有cout<<endl;就不行啊??
第二个问题是在cout<<pData_2[i]<<" ";上出现了问题 程序执行到这里就不能执行下去了 ,就是说强制停止了.我觉得要出错的话也应该是输出一些随机数最多了啊,怎么会强制停止呢??如果在这里输出不是cout<<pData_2[i]<<" ";而是别的任何东西的话都可以,所以我觉得问题可能会是在UINT * pData_2 = new UINT[1280*1024]; 上,但是就是找不出来。。。请问我在哪里出了问题啊??
[解决办法]
内存申请释放太乱,UINT * GetPix(CDC *pDC,char * FileName)应该改成UINT * GetPix(CDC *pDC,char * FileName,UINT *p_data);把数据放在GetPix外面申请,这样new和delete才能配对使用,不会出问题。
UINT * pData_1 = new UINT[1280*1024];
pData_1=GetPix(pDC,filename);
这里也有问题,pData_1指向了GetPix内部申请的内存,delete pData_1的时候是删除的new UINT[bmp.bmWidth * bmp.bmHeight],而不是你想删的
new UINT[1280*1024];后来你又用pData_2=GetPix(pDC,filename_lat)指向GetPix内部已经删除的内存区,再进行delete操作,当然不能往下走了。
建议理清指针的指向和内存的释放问题。
[解决办法]
完全逻辑大错误:
UINT * pData_1 = new UINT[1280*1024]; //1680*1050 pData_1=GetPix(pDC,filename); //刚申请1280*1024的内存,马上又让它泄露.pData_1又去指向GetPix中的pData,你要干嘛? for(int i=0;i <1280*1024;i+=100000) cout <<pData_1[i] <<" ";