none
MFC 控件实例的创建是在栈上还是在堆上 RRS feed

  • 问题

  • 各位大哥下午好!

    俺是C++的菜鸟,更是MFC的菜鸟,但俺就是喜欢这门难学S了的语言。俺发现在MFC编程时,包括CApp,CWnd实例在内,向导生成的控件,及控件变量都不是指针,于是俺想莫非这么多的控件(类)实例全在栈上分配?(俺知道象wxWidget库可都是在堆上创建控件实例的。)可是俺又发现,比如在如下代码中:

    void CLineOneDlg :: OnSize(UINT nType, int cx, int cy)
    {
     CDialog :: OnSize(nType, cx, cy);
     
     // TODO: Add your message handler code here
     this->Invalidate();
    }

    为什么又用到this 指针?这么说来又是在堆上创建的窗口实例了?俺在这个问题上犯迷胡了,请指点,多谢。

    2009年1月9日 8:14

答案

  • 对象分配到堆上还是栈上与对象类型无关,也和MFC无关。比如如果CLineOneDlg 是通过operator new创建出来的那么它就有可能创建到堆上,如果只是显式调用构造函数或者placement new那么他是分配在栈上。

     

    2009年1月9日 9:00
    版主
  • 个人认为分配在堆上还是栈上是实现的方式不同。与扩展性和灵活性关系不大。各有利弊。分配在堆上可以分配较大的内存,但是要自己控制内存释放,并且速度比栈慢。分配在栈上内存有限制默认是1MB,而内存不用自己管理,但速度会快一些。

    2009年1月9日 9:46
    版主
  • 呵呵,看你们说的挺有意思的.Smile

    简单的来说局部变量都是创建在栈上,全局变量都是在堆上.

    基本所有的控件都是在堆上(也就是内存上)创建的,栈只是个寄存器,临时变量存放的地方,控件不可能在它上面创建.

    Window的栈是用来函数调用的,也就1M左右吧.

    希望对你有帮助Smile

    2009年1月9日 16:36
    版主

全部回复

  • 对象分配到堆上还是栈上与对象类型无关,也和MFC无关。比如如果CLineOneDlg 是通过operator new创建出来的那么它就有可能创建到堆上,如果只是显式调用构造函数或者placement new那么他是分配在栈上。

     

    2009年1月9日 9:00
    版主
  • 谢谢您这么快回复。俺也知道一点对象分配到堆上还是栈上与对象类型无关,只是有的GUI库(如wxWidgets)只能在堆上创建控件或窗口实例而不能在栈上创建。俺想证实一下自已的想法即MFC的控件或窗口实例即可以在堆上创建也可以在栈上创建,如果真是这样的话,说明MFC的设计更富有弹性一些,也更能体现和发挥C++语言的威力。不知俺这个思路对不对头,请再指点,谢谢。

     

    2009年1月9日 9:41
  • 个人认为分配在堆上还是栈上是实现的方式不同。与扩展性和灵活性关系不大。各有利弊。分配在堆上可以分配较大的内存,但是要自己控制内存释放,并且速度比栈慢。分配在栈上内存有限制默认是1MB,而内存不用自己管理,但速度会快一些。

    2009年1月9日 9:46
    版主
  • 谢谢。总体感觉MFC多了一个选择,而这正好是C++被称为“具有上帝一样的操控能力”的先天禀赋。而现在众多流行OO语言(即便是原生的,如Delphi)差不多都只能在堆上分配对象,也就是说不具备在栈上分配对象的先天能力;不能在栈上分配控件/窗口实例的C++GUI库(如wx)总觉得好象C++瘸了一条腿。

    俺之所以在这个问题上这么执着是因为喜欢C++,喜欢他的“具有上帝一样的操控能力”,如果缺少或减弱了这种能力,可替代的OO语言随之就多不胜数了。想法如有偏颇,望多多指正,俺正开始学走路,希望一开始就走对。

     

    2009年1月9日 10:01
  • C++的有些东西确实比较灵活,可以让程序员更好的对系统进行控制。可以大幅提高性能。但是C++对于指针的操作是一柄双刃剑。大部分的Bug都是由于错误的指针使用引起的。不是造成系统内存泄露,就是系统不稳定。这样的问题在实际项目中屡见不鲜。要想更好地管理内存需要长时间的摸索和学习。我这方面做得也不好。

    2009年1月9日 10:17
    版主
  • 呵呵,看你们说的挺有意思的.Smile

    简单的来说局部变量都是创建在栈上,全局变量都是在堆上.

    基本所有的控件都是在堆上(也就是内存上)创建的,栈只是个寄存器,临时变量存放的地方,控件不可能在它上面创建.

    Window的栈是用来函数调用的,也就1M左右吧.

    希望对你有帮助Smile

    2009年1月9日 16:36
    版主
  •  Vonger 写:

    呵呵,看你们说的挺有意思的.

    简单的来说局部变量都是创建在栈上,全局变量都是在堆上.

    基本所有的控件都是在堆上(也就是内存上)创建的,栈只是个寄存器,临时变量存放的地方,控件不可能在它上面创建.

    Window的栈是用来函数调用的,也就1M左右吧.

    希望对你有帮助

     

    谢谢两位热心为俺这种菜鸟级C++迷指点迷津。

     

    基本所有的控件都是在堆上(也就是内存上)创建的,栈只是个寄存器,临时变量存放的地方,控件不可能在它上面创建.

     

    俺就是对这点很迷惑,因为俺看到Wizard 生成的控件变量(即通过Wizard 借DDX 生成的与资源关联的控件变量,如:CButton btnOK)都不是指针所以就以为是在栈上创建的,难道理解错了吗?

    2009年1月10日 0:49