【问题标题】:wxWidgets using the 'new' keywordwxWidgets 使用 'new' 关键字
【发布时间】:2009-05-11 22:25:04
【问题描述】:

对于wxWidgets,为什么要说:

MyFrame *frame = new MyFrame

代替:

MyFrame frame;

这两者有什么区别?第二个更好读也更容易使用,但所有示例都使用第一个,所以我想知道原因是什么。

澄清一下,我知道第二个版本不起作用,但我想知道是否有特定的设计决定导致必须使用第一种形式而不是第二种形式。 TIA。

【问题讨论】:

    标签: wxwidgets new-operator keyword


    【解决方案1】:

    第一个在堆上分配一个新的 MyFrame 实例,并返回一个指向它的指针。第二个直接在堆栈上创建一个新的 MyFrame 实例。

    您需要使用第一种语法的原因是您将此框架(UI 元素)添加到另一个 UI 元素中,例如窗口。窗口会将指针指向一个框架,并将其添加为子级。

    如果你使用第二种语法,你必须传递一个指向你的堆栈对象(&frame)的指针,它会编译,但是一旦你的方法返回,frame的析构函数就会被调用,因为frame会用完范围。这会“破坏”窗口内的引用。

    【讨论】:

    • 谢谢。这很有意义。这是否意味着如果我在不清理分配的内存的情况下终止程序,我会造成内存泄漏?如果是这样,是否有自动执行此操作的方法。我听说过使用 RAII 这个词,但只在 scoped_ptrs 等情况下看到它,其中的东西会自动消失。
    • 通常情况下是这样。但是,在程序终止时,您的操作系统将清理所有资源。大多数 GUI 工具包(我相信 wxWidgets 确实如此)处理 UI 元素的资源管理(即:删除调用),如果它们是另一个 UI 元素的父级。因此,例如,如果您将“框架”放在窗口内,删除窗口将自动删除您的框架。不过,这是工具包的“功能”,而不是语言。
    • 感谢您的快速响应! :)
    • 终止一个程序会释放它分配的所有内存,因此不会有导致内存泄漏的危险。
    • @bugmenot77:程序运行时发生内存泄漏。您可以重新创建资源并且永远不会释放它们,并且只要您的程序仍在运行,它的内存使用量就会不断增长(直到您最终用完)。但是,一旦你的程序被杀死,内存就会被清理掉。
    猜你喜欢
    • 2015-10-12
    • 2019-07-26
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多