1、在视图类的消息响应函数里new了一个CFont。
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
.......
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont);
.....
}2、在视图类的析构函数或是重写DestroyWindow函数里delete m_pfont。3、但程序退出时总是报内存泄露。这是为什么?4、只能改为如下方式实现吗:
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont); m_pFont->Detach();
delete m_pFont;
m_pFont = NULL;
}5、请高手指点一下。谢谢。
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
.......
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont);
.....
}2、在视图类的析构函数或是重写DestroyWindow函数里delete m_pfont。3、但程序退出时总是报内存泄露。这是为什么?4、只能改为如下方式实现吗:
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont); m_pFont->Detach();
delete m_pFont;
m_pFont = NULL;
}5、请高手指点一下。谢谢。
BOOL CMyPropertySheetView::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
if (m_pFont)
{
m_pFont->DeleteObject();
delete m_pFont;
m_pFont = NULL;
} return CEditView::DestroyWindow();
}使用上文中的方式4,不会有内存泄露问题。怀疑还是时机不对。
delete m_pFont;
可以同时用??不解
m_pFont->CreateFontIndirect(&logft);
这么创建觉得也不可理解啊~
直接create出来就行了
你第一种方法明显不行
你在消息里面new,如果多个消息发送,而只在析构函数里面delete~~这样是不行的~肯定有内存泄漏
你可以判断下m_pFont != NULL就不要在create和new了~
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
.......
if(m_pFont!=NULL)
{
m_pFont->DeleteObject();
m_pFont=NULL;
}
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont);
.....
}
然后在析构函数中同样调用DeleteObject()释放。
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
.......
if(m_pFont!=NULL)
{
delete m_pFont;就可以了,析构会自动调用deleteobject的
}
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont);
.....
}然后在ondestroy里面再delete m_pFont; m_pFont = NULL;
这句执行后m_pFont拥有的handle放弃了控制权,也就说m_pFont中handle指向的内存区没有释放。
修改方法,去掉:m_pFont->Detach();
http://blog.csdn.net/HeavenMonkey/archive/2008/05/24/2476411.aspx
你应该放在OnClose中
这种情况时
1.你必须确保new所在的函数在窗口类对象生命期内只会调用一次
2.如上面朋友所说 在执行new的时候先判断是否为NULL, 也就是确保只new一次
if (m_pFont)
{
m_pFont->DeleteObject();
delete m_pFont;
m_pFont = NULL;
}
这样的语句,还是抱内存泄露,问题没有解决啊。
不是很明白,具体的道理是怎么样的?
放到析构函数就可以了。为什么DestroyWindow函数在程序退出时没有调用呢?