CMenu类的 detach()函数的不解,菜单句柄与菜单分离是什么意思呢?
--------------------------------------------- SetMenu(NULL);  //移除菜单
CMenu menu;     //局部菜单对象 
menu.LoadMenu(IDR_MAINFRAME);  //从一个资源加载菜单
SetMenu(&menu);  //设置并显示菜单        menu.Detach();  //?????????以上代码,是vc++深入详解中的.
menu是局部对象.
书中说,由于 menu 是局部对象,所以最后必须加上 menu.Detach()方法.
目的是将菜单对象与菜单句柄分离.
我不明白,1.菜单句柄 与菜单对象不是 一个东西吗? 句柄不就是对象的一个标识吗?
2.菜单句柄 到底是什么东西呢?我一直认为,句柄就是一个数,就是菜单对象的"身份证号",我的理解不对吗?
3.二者分开了,局部的menu对象销毁时,菜单句柄不会销毁是什么意思,句柄不就是一个数字吗(一个身份证号吧!)
4.菜单句柄也是一个对象吗?如果句柄也是对象的话,菜单对象销毁后,句柄对象没有同步销毁,会不会造成"内存泄露"呀,
因为菜单句柄所代表的对象(应该占据内存吧),永远不会销毁呀?

解决方案 »

  1.   

    CMenu Class  An encapsulation of the Windows HMENU. 因为你定义的是CMenu句柄变量,出了作用域,它所关联的HMENU资源也会销毁
      

  2.   

    但是 detach 后,菜单对象销毁时,它所关联的HMENU资源不会销毁了,这会不会内存泄露呀,因为
    hmenu资源是不是,永远也得不到销毁呀?
    菜单对象不管他了,谁来管他呢?
      

  3.   

    SetMenu后 已经接管了hmenu  程序退出时会销毁它的
      

  4.   

    1.菜单句柄 与菜单对象不是 一个东西吗? 句柄不就是对象的一个标识吗?
    ===============
    不是一个东西,菜单对象是一个C++类的对象,它只是CMenu类的一个对象,只有关联了一个菜单句柄之后才能真正的操作一个菜单。另外,“句柄不就是对象的一个标识吗?”这里的对象如果是指C++对象,那么这句话是错的。2.菜单句柄 到底是什么东西呢?我一直认为,句柄就是一个数,就是菜单对象的"身份证号",我的理解不对吗?
    ==============
    菜单是一个资源,而菜单句柄是这个资源的一个标识。其实这个还是第一个问题。一个CMenu变量并不一定对应着一个菜单。3.二者分开了,局部的menu对象销毁时,菜单句柄不会销毁是什么意思,句柄不就是一个数字吗(一个身份证号吧!)
    ===================
    CMenu对象析构时会将与之关联的菜单资源也释放掉,所以这个菜单就没了。4.菜单句柄也是一个对象吗?如果句柄也是对象的话,菜单对象销毁后,句柄对象没有同步销毁,会不会造成"内存泄露"呀,
    因为菜单句柄所代表的对象(应该占据内存吧),永远不会销毁呀?
    ============
    你总体的问题是将C++中的对象和Windows中资源对象混为一谈了。
      

  5.   

    菜单      资源,内存,总之,实现菜单功能的一堆东西
    HMENU      指向菜单的指针
    CMenu      MFC对菜单的封装   CMenu.Detach()   : CMenu不在对这个菜单进行管理