如果我尝试定义一个像CButton btn;这样的图形用户界面按钮CButton,我会得到一个错误->因为我尝试将它放入堆栈
但是如果我使用CButton *btn = new CButton();,它就会工作,并且这会被放到堆中。
为什么我不能把CButton对象放到堆栈上?
发布于 2012-02-01 06:32:17
这是一个存储时间的问题。使用MFC,CButton的目的是让用户可以单击它,这将生成一个事件,然后您可以处理该事件。所有这些都表明,CButton的生命周期必须超出创建它的函数的生命周期。在典型的MFC对话框类(CDialog)中,CButton是一个成员变量,因此它的生存期就是类实例的生存期。如果在构造函数中声明CButton变量,它将超出作用域,并在构造函数结束时被销毁。
在某些不寻常的情况下,您可能希望根据直到运行时才知道的决策来创建按钮。在这种情况下,上面关于不使用裸“新”的评论是很重要的。使用智能指针(或智能指针容器)来保存您创建的CButton*,因此它们将被自动清除。这些智能指针或容器需要在类范围内创建。
发布于 2012-02-01 06:52:43
在MFC中有一个常见的习惯用法,我在其他地方都没见过。可以创建一个“临时”对象,该对象将被自动清除。清理发生在MFC处理的某些阶段,例如消息循环。
CButton * btn = (CButton *) FromHandle(hwnd);FromHandle函数返回一个指向CWnd对象的指针,但是您不知道该对象来自何处。您不应该尝试删除指针,也不要依赖指针在当前作用域之外有效--永远不要将其保存到成员变量中!如有必要,MFC将删除该对象。
发布于 2012-02-01 05:04:09
我不知道MFC,但我猜,你的CButton,分配在堆栈上运行超出了作用域,因此被销毁。
从其他地方访问该按钮的此实例将导致访问冲突。
https://stackoverflow.com/questions/9086522
复制相似问题