首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

NEW 有关问题 高手 留步

2012-02-07 
NEW 问题高手 留步UINT *GetPix(CDC *pDC,char * FileName){HBITMAPhbmp(HBITMAP)LoadImage(NULL,FileNam

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操作,当然不能往下走了。

建议理清指针的指向和内存的释放问题。
[解决办法]
完全逻辑大错误:

C/C++ code
    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] <<"  "; 

热点排行