我的C ++ Builder应用程序(RAD Studio XE4)正在泄漏内存。在进行一些调试时,我将原因跟踪到创建和销毁的表单上的TWebBrowser组件;显然,TWebBrowser或它创建的一个对象是泄漏内存。
我似乎也有一些奇怪的访问冲突:如果创建了这个带有TWebBrowser的表单,并且当前模式对话框已打开,则组策略刷新(无论是来自Windows的定期后台更新还是来自调用{ {1}})导致访问冲突。据推测,未完全删除的TWebBrowser正在尝试重新应用某些Internet Explorer设置并追逐指向已删除对象的指针。
答案 0 :(得分:3)
这是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();
}