【问题标题】:Continuous Memory leak while using WpfHWndSource使用 Wpf HWndSource 时连续内存泄漏
【发布时间】:2010-06-02 18:37:57
【问题描述】:

我必须在从 ocx 控件调用的 MFC 对话框中加载 WPF 用户控件。为此,我创建了一个 MFC 常规 Dll(启用了 clr 选项的混合模式常规 dll),我在其中创建了一个对话框,它使用 HWndSource 托管 wpf 用户控件。此导出的对话框被放置为从 ocx 调用的 MFC 对话框的子对话框。 Ny 中间对话框使用 C++/Cli 代码。

当主 MFC 对话框关闭时,我正在删除在堆上创建的中间对话框的 ptr 引用。但在此之后我仍然看到持续的内存泄漏或增长。 在对话框的析构函数中,我在 HWndSource 和 wpf 用户控件上调用 delete,以便调用它的 dispose。

但之后我看到那里持续泄漏。

这方面的任何帮助都会有所帮助。

【问题讨论】:

  • “我在 HWndSource 和 wpf 用户控件上调用 delete,以便调用它的 dispose”。嗯? 1、HWndSource和WPF控件都是托管对象,所以没有“delete”可以调用。 2. Dispose 是完全可选的(你不能因为忘记调用而泄漏内存)。请说明您实际做了什么以及您预期会发生什么。

标签: wpf


【解决方案1】:

可以在 google 中看到一些问题,使用 HWndSource 时会持续泄漏 4kb。我的问题似乎与此类似。

WPF Memory Leak on XP (CMilChannel, HWND)

我在一个与我的实际开发应用程序类似的示例 MFC Dilaog 应用程序中模拟了这个问题。在应用程序的构造函数中,我首先创建了一个虚拟 HWndSource 对象,它似乎在内存泄漏方面有所改善。

我在启用了 clr 的中间 mfc 常规 dll 中添加了另一个导出函数,它创建了 HWndSource。我正在从我的应用程序的构造函数中调用这个导出的函数。

void CConnectionPanelExport::CreateHwndSource()
{
    HWND hwnd = (HWND)(gcnew  System::Windows::Interop::HwndSource(*gcnew  
      System::Windows::Interop::HwndSourceParameters("MyApplication")))->Handle.ToPointer();
    CWnd *temp= CWnd::FromHandle(hwnd);
    temp->ShowWindow(SW_HIDE);
}

从我的应用程序的构造函数中,我调用了

CConnectionPanelExport connectionPanelExport;
connectionPanelExport.CreateHwndSource();

这似乎可以控制应用程序的内存,但我真的无法理解问题。

我已经尝试在我的实际开发应用程序中实现这一点,当我调用启用 /clr 的 dll 的这个导出方法时,我看到应用程序正在关闭。我正在非启用 clr 的主应用程序中创建启用 clr 的 dll 的静态链接

【讨论】:

  • 您应该使用问题下方的“编辑”按钮,而不是发布“答案”来添加信息。
猜你喜欢
  • 2011-02-21
  • 2015-10-05
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2010-12-05
  • 2011-03-19
相关资源
最近更新 更多