我的C++Builder应用程序(RAD XE4)正在泄漏内存。在进行一些调试时,我在创建和销毁的表单上查找了导致TWebBrowser组件的原因;显然,TWebBrowser或它创建的一个对象正在泄漏内存。
我还发现了一些奇怪的访问冲突:如果创建了这个带有TWebBrowser的表单,如果当前打开了一个模态对话框,那么组策略刷新(无论是从Windows的定期后台更新还是从调用gpupdate)都会导致访问冲突。据推测,不完全删除的TWebBrowser试图重新应用某些Internet设置,并追逐指向已删除对象的指针。
发布于 2014-07-24 13:21:56
这是C++Builder及其处理DelphiInterface属性中的一个错误。我在XE4和XE6中观察到了这一点;其他版本还没有经过测试。
显然,这与QC#106829描述的问题相同;德尔福处理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();
}https://stackoverflow.com/questions/24934939
复制相似问题