CPropertySheet属性页面如何释放内存?

WANGHUIJUNSHIWO 2010-12-30 01:08:15
如题,重写了PostNcDestroy 释放资源的方法,可是 GetPage(i)时候出错,出错的地方在于关闭窗口时候打开属性页面无法得到,请高手赐教!!!
void CProSheetHiNet::PostNcDestroy()
{

CPropertySheet::PostNcDestroy();

int nPages = GetPageCount();
for(int i = (nPages - 1); i>=0; i--)
{
CPropertyPage* pPage = GetPage(i);
ASSERT(pPage);
if(pPage)
{
delete pPage;
RemovePage(i);
TRACE("[CMyPropertySheet::OnDestroy] Removing page %ldn\n", i);
}
}

delete this;
...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南烟雨梦 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wanghuijunshiwo 的回复:]
引用 7 楼 beyond0824 的回复:

说错了,应该是OnNcDestroy函数,这样:
C/C++ code

void CProSheetHiNet::OnNcDestroy()
{
CPropertyPage::OnNcDestroy();

// TODO: 在此处添加消息处理程序代码
delete this;
}


我的问题终于暂时搞定了,原因是我……
[/Quote]
嗯,那个delete应该在CPropertyPage::OnNcDestroy中处理,而不是CPropertySheet.
WANGHUIJUNSHIWO 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 beyond0824 的回复:]

说错了,应该是OnNcDestroy函数,这样:
C/C++ code

void CProSheetHiNet::OnNcDestroy()
{
CPropertyPage::OnNcDestroy();

// TODO: 在此处添加消息处理程序代码
delete this;
}
[/Quote]

我的问题终于暂时搞定了,原因是我在 属性页面中也重写了 OnNcDestroy函数,我贴的代码是 sheet页面的代码,当sheet页面关闭时候将属性页面中new过的选项卡的内存释放了,导致在getpage时候出错。

WANGHUIJUNSHIWO 2010-12-30
  • 打赏
  • 举报
回复
我现在的问题 是getpage 不是这个 :)
江南烟雨梦 2010-12-30
  • 打赏
  • 举报
回复

if(pPage)
{
delete pPage;
RemovePage(i);
TRACE("[CMyPropertySheet::OnDestroy] Removing page %ldn\n", i);
}

最好不要在这里delete,当你调用RemovePage的时候,系统会自动销毁pPage所指的内存,此时已经被你delete了,所以这里肯定出错.
当系统销毁pPage的时候,回去调用它的OnNcDestroy函数,如果你的pPage是派生自CPropertyPage那么你就要自己重载OnNcDestroy,在最后加上delete pPage;
WANGHUIJUNSHIWO 2010-12-30
  • 打赏
  • 举报
回复
一样的问题,

for(int i = (nPages - 1); i>=0; i--)
{
CPropertyPage* pPage = GetPage(i);

当循环到关闭sheet窗口时候已经打开的页面时,getpage出错,好像是内存不可读
江南烟雨梦 2010-12-30
  • 打赏
  • 举报
回复
说错了,应该是OnNcDestroy函数,这样:

void CProSheetHiNet::OnNcDestroy()
{
CPropertyPage::OnNcDestroy();

// TODO: 在此处添加消息处理程序代码
delete this;
}
江南烟雨梦 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wanghuijunshiwo 的回复:]
引用 4 楼 beyond0824 的回复:

在NcDestroy中delete,才是真正的释放,而且安全..

只有PostNcDestroy方法啊
[/Quote]
你需要为你的CProSheetHiNet类添加WM_NCDESTROY消息响应函数,IDE会自动为你生成.
WANGHUIJUNSHIWO 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beyond0824 的回复:]

在NcDestroy中delete,才是真正的释放,而且安全..
[/Quote]
只有PostNcDestroy方法啊
江南烟雨梦 2010-12-30
  • 打赏
  • 举报
回复
在NcDestroy中delete,才是真正的释放,而且安全..
WANGHUIJUNSHIWO 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beyond0824 的回复:]

C/C++ code

void CProSheetHiNet::NcDestroy()
{
//你的代码
.....................
//加上下面这行
delete this;
}
[/Quote]

你的意思是 重写 NcDestroy() ? ps:我的代码最后面已经 delete this.
江南烟雨梦 2010-12-30
  • 打赏
  • 举报
回复
就是你要重载NcDestroy()

void CProSheetHiNet::NcDestroy()
{
//你的代码
.....................
//加上下面这行
delete this;
}

江南烟雨梦 2010-12-30
  • 打赏
  • 举报
回复

void CProSheetHiNet::NcDestroy()
{
//你的代码
.....................
//加上下面这行
delete this;
}

15,979

社区成员

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

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