【发布时间】:2011-10-07 12:52:50
【问题描述】:
主题说明了一切。在我关闭我的应用程序后,它会保留在具有一些内存的进程列表中。我尝试了谷歌性能工具和数小时的调试来找到泄漏。
是否有其他工具可以对其进行测试并找到问题?
谢谢。
【问题讨论】:
标签: c++ memory process wxwidgets memory-leaks
主题说明了一切。在我关闭我的应用程序后,它会保留在具有一些内存的进程列表中。我尝试了谷歌性能工具和数小时的调试来找到泄漏。
是否有其他工具可以对其进行测试并找到问题?
谢谢。
【问题讨论】:
标签: c++ memory process wxwidgets memory-leaks
我的猜测是您已经关闭了顶层窗口,因此也关闭了它的所有子窗口,但您还没有关闭应用程序本身。
如果您的程序以“正常”方式安排,则不会发生这种情况,但如果您有意或无意地使用了不寻常的安排,则可能会发生这种情况。
当然,修复它取决于您如何准确地安排代码。不过,这里有一个建议。
关闭应用程序的常用方法是调用 wxApp::OnExit(),这通常在顶级窗口关闭时发生。
你有你自己的类,派生自 wxApp 吗?你有 OnExit() 的覆盖吗?如果没有,那么就这样做并使用调试器检查它是否被调用。如果它没有被调用,请弄清楚如何确保它被调用。
另一个想法:使用以下方法检查您的顶级窗口是否会关闭应用程序
bool wxApp::GetExitOnFrameDelete() 常量
如果应用程序将在顶级窗口结束时退出,则返回 true 删除,否则为假。
如果这个返回false,使用对应的集合来实现。
第三个想法:当有任何顶级窗口打开时,应用程序不会退出。因此,也许您还有另一个已最小化或不可见但尚未关闭的顶级窗口?任何 wxDialog 或 WxFrame 或从它们派生的窗口都是顶级窗口,将阻止应用程序关闭。
第四个想法:你有应用程序对象的任何全局变量或属性,它们的析构函数可以进入无限循环吗?这些析构函数在窗口被销毁后被调用,如果其中一个没有返回,您将看到您描述的行为。
【讨论】:
您可以尝试查看 wxWidget 的示例文件夹。您会发现许多小而完整的应用程序,其中包含完整的初始化/退出应用程序周期。
检查一些示例并与您的应用的工作流程进行比较。
【讨论】:
是的...问题解决了。未销毁的 TopLevelWindow。内存泄漏....愚蠢的错误。
【讨论】: