我根本没有new内存,怎么会造成内存泄露的啊!!!可是内存不断的向上增长,就是这个函数的问题,把这个函数注释了就没事了,究竟是怎么回事啊?我研究了一天了,没找到原因啊,求求大家,救救我把,谁帮我解决了,小弟愿把所有分奉上,若要源码的话,请加QQ:183181455void CLRCDlg::ShowUpdate(BOOL isActive)
{
if (m_sshow == "")
{
m_sshow = _T("……");
}
Graphics g(m_memoryDC);//创建GDI+对象
g.SetSmoothingMode(SmoothingModeAntiAlias);//使用反走样
CPoint pt(0,0);//表示对话框的左上角
CPoint pos;//存储对话框的屏幕坐标 CRect rect;
GetWindowRect(rect);//获得窗口的屏幕坐标
pos.x = rect.left;
pos.y = rect.top; CSize sz;
sz.cx = 800;
sz.cy = 70; //通过指定的 BLENDFUNCTION对象 对原位图和目标位图的混合进行控制
BLENDFUNCTION b;
//AlphaFormat有两个选择:0表示常量alpha值,AC_SRC_ALPHA表示每个像素有各自的alpha通道。
b.AlphaFormat = AC_SRC_ALPHA;//混合模式
b.BlendFlags = 0;//保留选项
b.BlendOp = AC_SRC_OVER;//指明了源混合操作,但只支持AC_SRC_OVER,即根据源alpha值把源图像叠加到目标图像上。
b.SourceConstantAlpha = 255; FontFamily font(L"黑体");
GraphicsPath path,path3;
string fface=(string)m_sshow;
//转换为宽字符
WCHAR wfface[200];
MultiByteToWideChar(CP_ACP,0,fface.c_str(),static_cast<int>(fface.length())+1,
wfface,static_cast<int>(fface.length())+1);
//得到歌词的像素宽度
REAL width;
width = GetStringWidth(wfface,font,55,&g); //把歌词写入路径中
path.AddString(wfface,
-1,
&font,
FontStyleRegular,
55,
RectF(DrawProgressRect(width).X,5,2000,65),
NULL); //本区域 为歌词和当前卡拉OK应播放到的位置进行组合,达到卡拉OK效果
Region region(&path);
region.Intersect(Rect(0,0,DrawProgressRect(width).Width,65));
//背景路径
path3.AddRectangle(RectF(0,0,800,80)); SolidBrush bk(Color(128,128,128,128));
LinearGradientBrush bin(PointF(0,0),PointF(0,80),Color(255,0,0,255),Color(255,0,255,0));;//图形填充画刷(线变画刷)
LinearGradientBrush karaOK(PointF(0,0),PointF(0,80),Color(255,255,128,0),Color(255,128,50,200));;//图形填充画刷(线变画刷)
Pen pyy(Color(100, 0, 0,0),2.0f);
//通过给定的条件,以决定是否绘制背景
if(isActive)
{
g.FillPath(&bk,&path3);
} //绘制图形
g.FillPath(&bin,&path); //填充路径
g.DrawPath(&pyy, &path);//描边
//用另一个画刷填充区域,卡拉OK效果
g.FillRegion(&karaOK,®ion);
::UpdateLayeredWindow(m_hWnd,this->GetDC()->m_hDC,&pos,
&sz,m_memoryDC.m_hDC,&pt,0,&b,2);
}
{
if (m_sshow == "")
{
m_sshow = _T("……");
}
Graphics g(m_memoryDC);//创建GDI+对象
g.SetSmoothingMode(SmoothingModeAntiAlias);//使用反走样
CPoint pt(0,0);//表示对话框的左上角
CPoint pos;//存储对话框的屏幕坐标 CRect rect;
GetWindowRect(rect);//获得窗口的屏幕坐标
pos.x = rect.left;
pos.y = rect.top; CSize sz;
sz.cx = 800;
sz.cy = 70; //通过指定的 BLENDFUNCTION对象 对原位图和目标位图的混合进行控制
BLENDFUNCTION b;
//AlphaFormat有两个选择:0表示常量alpha值,AC_SRC_ALPHA表示每个像素有各自的alpha通道。
b.AlphaFormat = AC_SRC_ALPHA;//混合模式
b.BlendFlags = 0;//保留选项
b.BlendOp = AC_SRC_OVER;//指明了源混合操作,但只支持AC_SRC_OVER,即根据源alpha值把源图像叠加到目标图像上。
b.SourceConstantAlpha = 255; FontFamily font(L"黑体");
GraphicsPath path,path3;
string fface=(string)m_sshow;
//转换为宽字符
WCHAR wfface[200];
MultiByteToWideChar(CP_ACP,0,fface.c_str(),static_cast<int>(fface.length())+1,
wfface,static_cast<int>(fface.length())+1);
//得到歌词的像素宽度
REAL width;
width = GetStringWidth(wfface,font,55,&g); //把歌词写入路径中
path.AddString(wfface,
-1,
&font,
FontStyleRegular,
55,
RectF(DrawProgressRect(width).X,5,2000,65),
NULL); //本区域 为歌词和当前卡拉OK应播放到的位置进行组合,达到卡拉OK效果
Region region(&path);
region.Intersect(Rect(0,0,DrawProgressRect(width).Width,65));
//背景路径
path3.AddRectangle(RectF(0,0,800,80)); SolidBrush bk(Color(128,128,128,128));
LinearGradientBrush bin(PointF(0,0),PointF(0,80),Color(255,0,0,255),Color(255,0,255,0));;//图形填充画刷(线变画刷)
LinearGradientBrush karaOK(PointF(0,0),PointF(0,80),Color(255,255,128,0),Color(255,128,50,200));;//图形填充画刷(线变画刷)
Pen pyy(Color(100, 0, 0,0),2.0f);
//通过给定的条件,以决定是否绘制背景
if(isActive)
{
g.FillPath(&bk,&path3);
} //绘制图形
g.FillPath(&bin,&path); //填充路径
g.DrawPath(&pyy, &path);//描边
//用另一个画刷填充区域,卡拉OK效果
g.FillRegion(&karaOK,®ion);
::UpdateLayeredWindow(m_hWnd,this->GetDC()->m_hDC,&pos,
&sz,m_memoryDC.m_hDC,&pt,0,&b,2);
}
字符串没释放?
GetDC()只在OnInitDialog()里用了一次,可是内存却一直在增加,应该不是这个问题。
这个函数怎么用啊
MSDN的声明Status Clear(const Color &color);
不像是释放内存的函数啊?
VOID Example_Clear(HDC hdc)
{
Graphics graphics(hdc); // Create a Color object.
Color blueColor(255, 0, 0, 255); // Clear the screen with a blue background.
graphics.Clear(blueColor);
}
你这样试试,把你那个函数中创建的Graphics再不用的时候都Clear掉
在UpdateLayeredWindow貌似使用了GetDC,ShowUpdate这个函数只在OnInitDialog里用一次?::UpdateLayeredWindow(m_hWnd,this->GetDC()->m_hDC,&pos,
&sz,m_memoryDC.m_hDC,&pt,0,&b,2);
这种问题都问的出来,4个裤衩怎么拿到的! -_-!下面回答楼主问题这句 Graphics g(m_memoryDC); 后面的全都注释掉,跑一跑,看内存是否泄漏还有这三句
string fface=(string)m_sshow;
//转换为宽字符
WCHAR wfface[200];
MultiByteToWideChar(CP_ACP,0,fface.c_str(),static_cast<int>(fface.length())+1,
wfface,static_cast<int>(fface.length())+1);
把这三句注释掉,加一句
char fface[256] = "test";
测试跑一下看有没有内存泄漏其他地方内存泄漏可能性不大
::UpdateLayeredWindow(m_hWnd,this->GetDC()->m_hDC,&pos,
&sz,m_memoryDC.m_hDC,&pt,0,&b,2);GetDC请注意与ReleaseDC配对使用:
CDC* pDC=GetDC();
::UpdateLayeredWindow(m_hWnd,pDC->m_hDC,&pos,
&sz,m_memoryDC.m_hDC,&pt,0,&b,2);
ReleaseDC(pDC);
太谢谢你了!!!
果然 是我这猪头没释放DC。还有16楼的哥们,谢谢你。我加上这句后大量的内存泄露没有了,可是内存还是慢慢的向上涨。我怀疑别的地方也有问题,
Path 在AddString之后,需要手动释放吗?
Graphics对象需要手动释放吗?同样感谢15楼的建议,我一会按你的建议再DEBUG一下。
GDI+的Path和Graphics对象超出作用域会自动析构,不必手动释放。
至于内存缓慢上升,可能是正常现象,如果到了一定值不再上升,就不要紧张。如果还是一直上升,可能是其他地方有问题,至少你贴的代码俺没看出其他的问题。