wxWidgets使用“new”关键字

3
对于wxWidgets,为什么需要这样说:

MyFrame *frame = new MyFrame

替代方案:

MyFrame frame;

这两者有什么不同呢?第二种更易读、更易使用,但所有示例都使用第一种,所以我想知道原因。

只是想澄清,我知道第二个版本不可行,但我想知道是否有特定的设计决策导致必须使用第一种形式而不是第二种形式。谢谢。

1个回答

3
第一种方法在堆上分配一个新的MyFrame实例,并返回指向它的指针。第二种方法直接在堆栈上创建一个新的MyFrame实例。
需要使用第一种语法的原因是您将此框架(UI元素)添加到另一个UI元素中,例如窗口。窗口将获取指向框架的指针,并将其添加为子项。
如果使用第二种语法,则必须传递指向堆栈对象(&frame)的指针,这将编译,但是一旦方法返回,frame的析构函数就会被调用,因为frame将超出范围。这将“破坏”窗口内部的引用。

谢谢。这很有道理。这是否意味着,如果我在不清理已分配的内存的情况下终止程序,那么我会创建内存泄漏?如果是这样,是否有自动化的方法来做到这一点?我听说过RAII这个术语,但只在scoped_ptrs等情况下看到它,其中东西会自动消失。 - bugmenot77
通常来说,这是正确的。但是,在程序终止时,操作系统会清理所有资源。大多数GUI工具包(我相信wxWidgets也是如此)处理UI元素的资源管理(即删除调用),如果它们已由另一个UI元素作为父级。例如,如果您将您的“frame”放在窗口内部,则删除窗口将自动删除您的“frame”。尽管如此,这是工具包的“功能”,而不是语言的功能。 - Reed Copsey
感谢您的超快速回复! :) - bugmenot77
终止程序会释放其分配的所有内存,因此不会造成内存泄漏的危险。 - PiedPiper
1
@bugmenot77:内存泄漏会在程序运行时发生。您可以重建资源并永远不释放它们,只要您的程序仍在运行,它的内存使用量就会不断增长(直到最终耗尽)。但是一旦您的程序被杀死,内存将被清理。 - Reed Copsey
@Reed Copsey:你的第二段需要进行一些编辑,因为wxWidgets框架是一个顶级窗口,除了MDI子框架外,不会添加到其他窗口中。因此最好说,新创建的框架不会被显示,或者在堆栈展开时立即被显示并销毁。 - mghie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接