目前位置: VCer资源中心 >>> VCer知道

[本帖已阅读901次 分值0 回复0次] 张贴资源 发回信箱 控制面板

怎么样delete一个CMenu对象啊

提供者:lucy 张贴时间:2007-03-09 14:21:48.0 出处:newsmth.net 作者:不祥

怎么样delete一个CMenu对象啊(2007-03-09 14:21:48.0)


lucy


 
级别: VCer小兵
头衔: VCer会员

经验: 10
作品: 92
分会: 华北分会
注册: 2007-03-09 10:35:00.0
登录: 2007-05-31 14:40:23.0

标  题: [合集] 怎么样delete一个CMenu对象啊

发信站: BBS 水木清华站 (Tue Jun 22 22:05:08 2004), 站内

☆─────────────────────────────────────☆ 

  MingGe16 (pwm) 于  (Tue Jun 22 16:46:58 2004)  提到:

如果创建如下的一个Menu对象

CMenu* menu;

menu=new CMenu();

menu.load(IDR_XX);

之后在相应的析构函数中是

menu->Detatch();

还是以下的呢?

delete menu;

此外如果这个CMenu* menu;声明放在构造函数里面,效果好像不同,

而且new之前按道理应该先free()一下比较安全,但是

能否解释一下?

☆─────────────────────────────────────☆ 

  ptf (旁听佛?胖土匪) 于  (Tue Jun 22 17:05:01 2004)  提到:

我是没怎么看懂你的意思

不过,如果你要一直在程序里面使用这个menu的话

你可以在C****View里面声明一个CMenu对象

eg.

        CMenu* m_pMenu;

然后在C****View的构造函数里面

        m_pMenu = new CMenu;

在你要用的时候再往里面添加菜单项

        m_pMenu->load(...);

最后在C****View的析构函数里面

        delete m_pMenu;

【 在 MingGe16 (pwm) 的大作中提到: 】                                         

: 如果创建如下的一个Menu对象                                                   

: CMenu* menu;                                                                 

: menu=new CMenu();                                                           

: ...................

                                                                               

☆─────────────────────────────────────☆ 

  MingGe16 (pwm) 于  (Tue Jun 22 17:07:57 2004)  提到:

问题是new了这样一个对象,哪种销毁的方式比较好?

因为这个操作过程之中很容易发生内存泄漏

【 在 ptf (旁听佛?胖土匪) 的大作中提到: 】                                   

: 我是没怎么看懂你的意思                                                       

: 不过,如果你要一直在程序里面使用这个menu的话                                 

: 你可以在C****View里面声明一个CMenu对象                                       

: ...................                                                         

                                                                               

                                                                               

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  ptf (旁听佛?胖土匪) 于  (Tue Jun 22 17:08:54 2004)  提到:

new <--->delete

alloc <---> free

                                                                               

【 在 MingGe16 (pwm) 的大作中提到: 】                                         

: 问题是new了这样一个对象,哪种销毁的方式比较好?                             

: 因为这个操作过程之中很容易发生内存泄漏                                       

                                                                               

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  MingGe16 (pwm) 于  (Tue Jun 22 17:10:59 2004)  提到:

现在是讨论对于menu的detach和delete两种方式

还有第二个问题麻烦老兄解释解释

此外如果这个CMenu* menu;声明放在构造函数里面,效果与在局部函数中声明不同

【 在 ptf (旁听佛?胖土匪) 的大作中提到: 】                                   

: new <--->delete                                                             

: alloc <---> free                                                             

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  ptf (旁听佛?胖土匪) 于  (Tue Jun 22 17:11:23 2004)  提到:

detach != delete

【 在 MingGe16 (pwm) 的大作中提到: 】                                         

: 现在是讨论对于menu的detach和delete两种方式                                   

: 还有第二个问题麻烦老兄解释解释                                               

: 此外如果这个CMenu* menu;声明放在构造函数里面,效果与在局部函数中声明不同     

: ...................                                                         

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  MingGe16 (pwm) 于  (Tue Jun 22 17:12:40 2004)  提到:

detach以后再delete就会出错的,反之依然

【 在 ptf (旁听佛?胖土匪) 的大作中提到: 】                                   

: detach != delete                                                             

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  ptf (旁听佛?胖土匪) 于  (Tue Jun 22 17:13:11 2004)  提到:

局部使用的话,你可以不用指针,直接使用对象啊

CMenu menu;

这样菜单对象的生存期就是那个函数,他可以自动销毁的

【 在 MingGe16 (pwm) 的大作中提到: 】                                         

: 现在是讨论对于menu的detach和delete两种方式                                   

: 还有第二个问题麻烦老兄解释解释                                               

: 此外如果这个CMenu* menu;声明放在构造函数里面,效果与在局部函数中声明不同     

: ...................                                                         

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  MingGe16 (pwm) 于  (Tue Jun 22 17:15:37 2004)  提到:

而且我是在析构的地方detach,在局部定义和使用之后就销毁会带来错误

还有一个问题,在一个menu对象定义并使用完之后(因为别的地方并没有出现这个对象名)为

什么就不能马上销毁它?

【 在 ptf (旁听佛?胖土匪) 的大作中提到: 】                                   

: detach != delete                                                             

☆─────────────────────────────────────☆ 

  MingGe16 (pwm) 于  (Tue Jun 22 17:17:56 2004)  提到:

我试过,这样就出错了,没有办法啊(是很奇怪,但是确实这样啊)

switch ( PopupCurrentItem->getType() )                                         

    {                                                                         

    case CMenuItem::POPUP:                                                     

        {

    //FREE(pop_upmenu);

    pop_upmenu= new CMenu();    ////test

        pop_upmenu->CreatePopupMenu();

    addDynamicPopupMenu(pop_upmenu, (CPopMenuItem*)(PopupCurrentItem));

        pSubMenu->InsertMenu( 0, MF_BYPOSITION | MF_POPUP, (UINT)pop_upmenu->

GetSafeHmenu(), PopupCurrentItem->getName().c_str() );    //pop_upmenu->

Detach();

        }

    break;

【 在 ptf (旁听佛?胖土匪) 的大作中提到: 】                                   

: 局部使用的话,你可以不用指针,直接使用对象啊                                 

: CMenu menu;

: 这样菜单对象的生存期就是那个函数,他可以自动销毁的                           

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  ptf (旁听佛?胖土匪) 于  (Tue Jun 22 17:19:04 2004)  提到:

你detach之后menu对象和他的句柄分离了

当然就不能继续对他操作了

你可以试试DestroyMenu( );

MSDN这样说:

Destroys the menu and any Windows resources that were used. The menu is det

ached from the CMenu object before it is destroyed. The Windows DestroyMenu

function is automatically called in the CMenu destructor.

【 在 MingGe16 (pwm) 的大作中提到: 】                                         

: detach以后再delete就会出错的,反之依然                                       

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  ptf (旁听佛?胖土匪) 于  (Tue Jun 22 17:19:58 2004)  提到:

                                                                               

对象的作用域限制

【 在 MingGe16 (pwm) 的大作中提到: 】                                         

: 而且我是在析构的地方detach,在局部定义和使用之后就销毁会带来错误             

: 还有一个问题,在一个menu对象定义并使用完之后(因为别的地方并没有出现这个对象名

)为什么就不能马上销毁它?                                                     

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  ptf (旁听佛?胖土匪) 于  (Tue Jun 22 17:25:28 2004)  提到:

原来是这样啊,不过我想你还是在创建popmenu的父菜单

的时候一次性把这个popmenu也创建比较好

【 在 MingGe16 (pwm) 的大作中提到: 】                                         

: 我试过,这样就出错了,没有办法啊(是很奇怪,但是确实这样啊)                 

: switch ( PopupCurrentItem->getType() )                                       

:    {                                                                       

: ...................

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  MingGe16 (pwm) 于  (Tue Jun 22 17:40:00 2004)  提到:

谢谢ptf兄!

【 在 ptf (旁听佛?胖土匪) 的大作中提到: 】                                   

: 原来是这样啊,不过我想你还是在创建popmenu的父菜单                           

: 的时候一次性把这个popmenu也创建比较好           

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1173421308390.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 0% (0 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)