bool CMyDlg::PicDraw(int nID, Gdiplus::Image* pImage,const CString strName)
{
ASSERT(pImage);
CWnd* pWnd = GetDlgItem(nID); // IDC_STATIC1 specified
switch(nID)
{
case IDC_PICA:
strPicTitle[0] = strName;
break;
case IDC_PICB:
strPicTitle[1] = strName;
break;
case IDC_PICC:
strPicTitle[2] = strName;
break;
case IDC_PICD:
strPicTitle[3] = strName;
break;
case IDC_PICE:
strPicTitle[4] = strName;
break;
case IDC_PICF:
strPicTitle[5] = strName;
break;
}
RECT rc;
pWnd->GetClientRect(&rc);
UINT x = pImage->GetWidth();
UINT y = pImage->GetHeight();
if (x != 0)
{
long w = rc.right-rc.left;
long h = rc.bottom-rc.top; pImage->GetThumbnailImage(w,y * w / x,NULL,NULL); CDC* pDC = pWnd->GetDC(); //pWnd->SetRedraw();
using namespace Gdiplus;
if (pImage!=NULL)
{
Graphics graphics= pDC->m_hDC ;
graphics.DrawImage(pImage, 0, 0, w , y * w / x);
graphics.ReleaseHDC(pDC->m_hDC);
}
pWnd->ReleaseDC(pDC);
return true;
}
else
return false;
}是pWnd应该释放资源呢?还是Graphics没有释放资源?Gdiplus::Image* pImage这个传入的参数,我每次在调用的
时候,都用
using namespace Gdiplus;
//在此代码段中,重点是GDI+要用宽字符串,所以你要用USES_CONVERSION 和 A2W
USES_CONVERSION;
Image* m_pImage1=Image::FromFile(A2W((LPCTSTR)strJpgName),FALSE);
PicDraw(IDC_PIC,m_pImage1,strJpgName);
delete m_pImage1;不知那个地方,没有释放资源?
{
ASSERT(pImage);
CWnd* pWnd = GetDlgItem(nID); // IDC_STATIC1 specified
switch(nID)
{
case IDC_PICA:
strPicTitle[0] = strName;
break;
case IDC_PICB:
strPicTitle[1] = strName;
break;
case IDC_PICC:
strPicTitle[2] = strName;
break;
case IDC_PICD:
strPicTitle[3] = strName;
break;
case IDC_PICE:
strPicTitle[4] = strName;
break;
case IDC_PICF:
strPicTitle[5] = strName;
break;
}
RECT rc;
pWnd->GetClientRect(&rc);
UINT x = pImage->GetWidth();
UINT y = pImage->GetHeight();
if (x != 0)
{
long w = rc.right-rc.left;
long h = rc.bottom-rc.top; pImage->GetThumbnailImage(w,y * w / x,NULL,NULL); CDC* pDC = pWnd->GetDC(); //pWnd->SetRedraw();
using namespace Gdiplus;
if (pImage!=NULL)
{
Graphics graphics= pDC->m_hDC ;
graphics.DrawImage(pImage, 0, 0, w , y * w / x);
graphics.ReleaseHDC(pDC->m_hDC);
}
pWnd->ReleaseDC(pDC);
return true;
}
else
return false;
}是pWnd应该释放资源呢?还是Graphics没有释放资源?Gdiplus::Image* pImage这个传入的参数,我每次在调用的
时候,都用
using namespace Gdiplus;
//在此代码段中,重点是GDI+要用宽字符串,所以你要用USES_CONVERSION 和 A2W
USES_CONVERSION;
Image* m_pImage1=Image::FromFile(A2W((LPCTSTR)strJpgName),FALSE);
PicDraw(IDC_PIC,m_pImage1,strJpgName);
delete m_pImage1;不知那个地方,没有释放资源?
看不大出来,好像没有泄漏。如果有泄漏,应该是Graphics 的问题
我就是没能明白,这个Graphics怎么释放资源?
还有,声明一个CWnd指针,没有内存泄漏的问题吗?
{
// TODO: 在此添加控件通知处理程序代码
lPicCnt += 1;
CString strPicName;
strPicName.Format("%d",lPicCnt);
CString strName = "c:\\";
CString strBmp = ".bmp";
strPicName = strName + strPicName + strBmp;
m_strBmpName = strPicName; CString strJpg = ".jpg";
CString strJpgName;
strJpgName.Format("%d",lPicCnt); strJpgName = strName + strJpgName + strJpg; m_strJpgName = strJpgName;
CListBox* pLB = (CListBox*) GetDlgItem(IDC_LIST);
pLB->InsertString(-1, (LPCTSTR)strJpgName);
CStatic* pST = (CStatic*) GetDlgItem(IDC_PICNUM);
CString strTitle;
strTitle.Format("图片 %d 张",lPicCnt);
pST->SetWindowText((LPCTSTR)strTitle); //TS_GrabImageFile ((LPTSTR)(LPCTSTR)strPicName);
//long bufsize = 1050 * 1050;
//char *pbuf = new char[bufsize];
//TS_GrabImage(pbuf, bufsize);
//CFile file;
//file.Open("test.bmp", CFile::modeCreate | CFile::modeReadWrite);
//file.Write(pbuf, bufsize);
//file.Close();
// TS_GrabImageFile ((LPTSTR)(LPCTSTR)m_strBmpName); MSG message; m_nTimer = SetTimer(1, 100, NULL); // 1/10 second
ASSERT(m_nTimer != 0);
volatile int nTemp;
for (m_nCount = 0; m_nCount < nMaxCount; m_nCount++)
{
for (nTemp = 0; nTemp < 10000; nTemp++)
{
// uses up CPU cycles
}
if (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
//while (::GetMessage(&message, NULL, 0, 0))
//{
// ::TranslateMessage(&message);
// ::DispatchMessage(&message);
//}
}
KillTimer(m_nTimer);
//Invalidate();
using namespace Gdiplus;
//在此代码段中,重点是GDI+要用宽字符串,所以你要用USES_CONVERSION 和 A2W USES_CONVERSION; Image* m_pImage1=Image::FromFile(A2W((LPCTSTR)m_strJpgName),FALSE);
PicDraw(IDC_PIC,m_pImage1,m_strJpgName); switch (lPicCnt % 6)
{
case 1:
PicDraw(IDC_PICA,m_pImage1,strJpgName);
delete m_pImage1;
break;
case 2:
PicDraw(IDC_PICB,m_pImage1,strJpgName);
delete m_pImage1;
break;
case 3:
PicDraw(IDC_PICC,m_pImage1,strJpgName);
delete m_pImage1;
break;
case 4:
PicDraw(IDC_PICD,m_pImage1,strJpgName);
delete m_pImage1;
break;
case 5:
PicDraw(IDC_PICE,m_pImage1,strJpgName);
delete m_pImage1;
break;
case 0:
PicDraw(IDC_PICF,m_pImage1,strJpgName);
delete m_pImage1;
break;
} CScrollBar* pSB = (CScrollBar*) GetDlgItem(IDC_SCROLLBAR);
pSB->SetScrollRange(0, lPicCnt);
pSB->SetScrollPos(lPicCnt);
}
这是抓图的程序,我用Windows资源管理器,看着内存每次都增长,
画图的时候也是.
如:
Detected memory leaks!
Dumping objects ->
D:\Program Files\Microsoft Visual Studio\MyProjects\MyOwerDrawCtrl\SDI1\SDI1View.cpp(230) : {204} client block at 0x00376910, subtype 0, 64 bytes long.
a CButton object at $00376910, 64 bytes long
Object dump complete.
双击D:\Program Files.....这行即可看见出现Leak的地方!
2 :PicDraw(IDC_PIC,m_pImage1,m_strJpgName);
3 :delete m_pImage1;
我用windows任务管理器观察,单步调试,
执行过1行时,内存没增加,当执行完
第二行时内存增加,
执行完第三行时,内存没有再减少。
所以PicDraw(int nID, Gdiplus::Image* pImage,const CString strName)
里一定有内存没释放的地方,是不是?
可我又看不出哪里没释放。
这个函数里,
pImage->GetThumbnailImage(w,y * w / x,NULL,NULL);
这句是产生内存泄漏的根本原因。
正确用法:
Image* pThumbnail = pImage->GetThumbnailImage(w,y * w / x,NULL,NULL);
delete pThumbnail;GetThumbnailImage函数返回的是Image*,所以在内存里消耗了资源,应该释放。