【问题标题】:TWebBrowser memory leaks and access violationsTWebBrowser 内存泄漏和访问冲突
【发布时间】:2014-09-16 01:56:37
【问题描述】:
我的 C++Builder 应用程序 (RAD Studio XE4) 正在泄漏内存。在进行一些调试时,我在一个创建和销毁的表单上找到了 TWebBrowser 组件的原因;显然,TWebBrowser 或它创建的对象之一正在泄漏内存。
我似乎也遇到了一些奇怪的访问冲突:如果曾经创建过带有 TWebBrowser 的此表单,并且当前打开了模式对话框,则刷新组策略(无论是来自 Windows 的定期后台更新还是来自调用 @ 987654321@) 导致访问冲突。据推测,未完全删除的 TWebBrowser 正在尝试重新应用一些 Internet Explorer 设置并追逐指向已删除对象的指针。
【问题讨论】:
标签:
c++builder
twebbrowser
【解决方案1】:
这是 C++Builder 及其对 DelphiInterface 属性的处理中的一个错误。我在 XE4 和 XE6 中观察到了这一点;其他版本未经测试。
显然这与QC#106829 中描述的问题相同; Delphi 对 IDispatch 属性的处理调用 AddRef 而没有正确调用 Release。
一种解决方法是避免使用 IDispatch Document 属性,而是使用受保护的 getter 来获取文档:
_di_IDispatch GetDocument(TWebBrowser *browser)
{
// Hack to change access modifiers on TWebBrowser. Since accessing the public
// property doesn't work, we'll access the protected getter.
class TWebBrowserHack : public TWebBrowser
{
public:
_di_IDispatch GetDocument() { return Get_Document(); }
};
return static_cast<TWebBrowserHack*>(browser)->GetDocument();
}