CVIew::hanshu()
{
CClass *p=New CClass()
}
我发觉会delete时出错
{
CClass *p=New CClass()
}
我发觉会delete时出错
解决方案 »
- VS2010 下MFC怎么变成VC6.0样式
- 在VC6.0中,多文档结构,如何实现在状态栏显示鼠标当前位置所在点的坐标的功能?
- new分配的各类型的内存单元的大小是多少
- 怎么把bmp图像二值化,变成黑白两色
- 请问,各位牛人,EXE中的“this”,在DLL封装中怎么处理??谢谢!
- IE历史记录,C:\Documents and Settings\Administrator\Local Settings\History里面
- vc编程遇到的问题,高分100求助!!!
- 如何做一个有立体感的label(静态文本控件)
- 求教一个demo程序:怎样实现server端动态分配端口给client端的请求
- SDK里,如何在程序里使对话框中的Edit控件只能输入数字?
- 请问CFileDialog如何设定它的窗口弹出位置?
- 请问一个多文档主框架向子view发送自定义消息的问题?
delete []p
{
CClass *p=New CClass()
。
delete (p);}
{
CClass *p=New CClass()
//做其它事情
delete p;
p = NULL;
}
{
CClass *p=New CClass()
//做其它事情
delete p;
p = NULL;
}
同意
或者你就不用指针了,程序自己控制删除。
程序自己控制删除是在析构函数中还是指的其他?????
程序自己控制删除是在析构函数中还是指的其他?????
------------------------------------
这里的p指针是局部变量,必须在创建它的函数中释放,否则就会有内存泄漏
BOOL CDockPageBar::AddPage(CWnd *pWnd, LPCTSTR sText, UINT IconID)
{
ASSERT(IsWindow(pWnd->m_hWnd));
CPageItem *pItem;//该指针要delete掉吗
pItem = new CPageItem();
pItem->m_pWnd = pWnd;
pItem->m_pWnd->SetParent (this);
pItem->m_strLabel = sText;
CClientDC dc(this);
HFONT oldFont = (HFONT)dc.SelectObject(m_font);
pItem->m_uiTabWidth = dc.GetTextExtent (sText).cx;
dc.SelectObject(oldFont); if(IconID)
{
pItem->m_hIcon = AfxGetApp()->LoadIcon(IconID);
pItem->m_uiTabWidth += 18;
}
else
pItem->m_hIcon = NULL; pItem->m_uiTabWidth += 9; if(pWnd)
{
CRect rect;
//hubin 2004-6-28
pWnd->GetClientRect(rect);
int cx=rect.Width();
int cy=rect.Height();
CWnd::GetClientRect(rect);
cx-=rect.Width();
cy-=rect.Height();
if(cx<=0)
cx=0;
if(cy<=0)
cy=0;
if(cx>0 || cy>0)
{
GetWindowRect(rect);
GetParent()->ScreenToClient(&rect);
rect.right+=cx;
rect.bottom+=cy;
MoveWindow(rect);
CSize newsize(rect.Width(),rect.Height()+ITEMBUTTON_HEIGHT);
m_szHorz = m_szVert = m_szFloat = newsize; }
//////////////////////////;
GetClientRect(rect, m_PageList.GetCount()>1?TRUE:FALSE);
pWnd->MoveWindow(rect);
pWnd->ShowWindow(SW_HIDE);
} m_PageList.AddTail(pItem);
UpdateWindow();
//但是delete pItem会导致错误
return TRUE;
}
这种new出来的对象一般都在堆上。在你不再需要这个对象的地方释放即可,注意不可超越指针变量申明的域,除非还有指针指向它。
{
delete p;
p = null;
}
(2)不是 所有由"你"的代码new出来的对象,都必须由"你"的代码delete.
(3)pItem = new CPageItem();
delete出错,是因为m_PageList还在用pItem呢,怎么能删除
在delete前加上PageList.RemoveAll()就不会出错了。
可以在应用程序不用到该指针时,delete掉PageList里记录的内容,同时清空PageList。
怎样判别呢?不可以在函数以外的地方delete掉呀
delete pItem;
在上面那个函数中没有问题,可是在UpdateSize()函数中就会有问题
特别是在
if(pItem->m_pWnd)
pItem->m_pWnd->MoveWindow(ClientRect);//此处
如果我在上面函数中不用指针,用类对象,也是出现同样的问题
请高手们解决!
void CDockPageBar::UpdateWindow()
{
UpdateSize();
if(m_nActivePage < 0)
SetActivePage(0);
Invalidate(FALSE);
}
void CDockPageBar::UpdateSize()
{
UINT PageCount = m_PageList.GetCount();
if(PageCount < 1) return; CPageItem *pItem;//=new CPageItem;
CRect rect,ClientRect,ItemRect;
if(PageCount == 1)
{
GetClientRect(ClientRect, FALSE);
pItem = (CPageItem*)GetPageItem(0);
if(pItem->m_pWnd)
{
pItem->m_pWnd->MoveWindow(ClientRect);
pItem->m_pWnd->ShowWindow(SW_SHOW);
}
return;
} POSITION pos; GetClientRect(rect, FALSE);
rect.left += 6;
rect.right -= 6;
rect.bottom -= 3; // 2004/03/28 增加对Pager bar放置位置的可选支持(目前只有顶部和底部可选)
if (ATPAGER(m_dwPagerStyle)) //如果位于顶部
{
rect.top += 1;
rect.bottom = rect.top + ITEMBUTTON_HEIGHT - 2;
}
else
{
rect.bottom -= 1;
rect.top = rect.bottom - ITEMBUTTON_HEIGHT + 2;
} GetClientRect(ClientRect, TRUE); ItemRect = rect;
int AreaWidth = 0,ItemWidth,ItemIndex=0; for(pos=m_PageList.GetHeadPosition();pos!=NULL;ItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
// if(pos!=0x00000000)
{
// CString strTemp=pItem->m_strLabel;
if(pItem)
{
ItemWidth = pItem->m_uiTabWidth;
AreaWidth += ItemWidth;
ItemRect.right = ItemRect.left+ItemWidth-1;
pItem->m_rtLabel = ItemRect;
ItemRect.left = ItemRect.right + 1;
if(pItem->m_pWnd)
pItem->m_pWnd->MoveWindow(ClientRect);
}
} } if(AreaWidth > rect.Width())
{
ItemRect = rect;
int AreaWidth,MaxWidth = rect.Width()/PageCount;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
AreaWidth = pItem->m_uiTabWidth;
ItemWidth = (MaxWidth < AreaWidth)?MaxWidth:AreaWidth;
ItemRect.right = ItemRect.left+ItemWidth;
pItem->m_rtLabel = ItemRect;
ItemRect.left = ItemRect.right + 1;
}
}
}}
首先要弄清楚这些代码为什么会在这里,是用来做什么的,然后再去尝试如何进行加工处理。不要在你没看懂代码之前就随便修改别人的代码,读懂别人的代码不是一件容易的事。-------------------------------------------------------
MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)
可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
下载地址:http://nj.onlinedown.net/soft/6591.htm
关键是upsize和前面的AddPage的值没有调用关系,为什么不可以改呢?
有没有很好的解决方案