应该在哪里释放内存?

alamb 2003-08-30 12:48:56
继承了ClistCtrl,由于程序的需要,在插入一行数据之后通过SetItemData把一个指针(指向一个新请求的内存)设置到该行的data里。
当窗口被关闭时,我需要把分配的内存释放掉,那么应该重载CListCtrl的哪个成员函数或者响应哪个消息呢?
...全文
46 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
triout 2003-08-30
  • 打赏
  • 举报
回复
呵呵,对于窗体继承类中分配的内存空间,如果在析构函数中释放会导致失败。

我的做法是拦截WM_CLOSE函数,在WM_CLOSE中释放。
triout 2003-08-30
  • 打赏
  • 举报
回复
看你的具体情况了,
一般在析构函数中,但如果你能确认内存不再使用了,应该立即释放。

另外,析构函数只释放全局的或类变量的,对于函数内部局部定义的变量,应该在函数退出前释放,否则,你分配的内存将成为孤岛,没有办法释放了。
bcpl 2003-08-30
  • 打赏
  • 举报
回复
映射LVN_DELETEITEM消息,设你的指针指向一个CItemInfo对象。

void CDiskListView::OnDeleteItem(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pnmlv = (NM_LISTVIEW*)pNMHDR;
delete (CItemInfo*)pnmlv->lParam;
*pResult = 0;
}
这种处理方式确保ItemData中的相关数据与ListItem的生存期保持一致。
alamb 2003-08-30
  • 打赏
  • 举报
回复
bcpl(林平之)的方法可行,另外WM_DESTROY也可以,昨晚头晕晕搞错了。不过还是在LVN_DELETEITEM消息里面处理最妥当。谢谢各位。
wwww2 2003-08-30
  • 打赏
  • 举报
回复
在WM_DESTROY里面我记得我原来用过是可以的,你确定是先做处理再调用系统默认DESTROY函数?
smch 2003-08-30
  • 打赏
  • 举报
回复
总之是在退出的必经函数中。
smch 2003-08-30
  • 打赏
  • 举报
回复
析构函数中。
alamb 2003-08-30
  • 打赏
  • 举报
回复
不能在析构函数里面处理,因为执行析构函数的时候已经不能使用GetItemData了。
我试过在WM_DESTROY里面处理,但是一样不能用GetItemData,WM_CLOSE好像拦截不到,不知道是不是方法不对。
LVN_DELETEITEM的方法我试一下……

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧