Com 释放TStreamAdapter时指针操作无效
有谁能解释一下,当我试图删除Com 释放TStreamAdapter时指针操作无效,com,c++builder,Com,C++builder,有谁能解释一下,当我试图删除TStreamAdapter时,为什么会得到“无效指针操作”?或如何从TStreamAdapter中正确释放内存?如果我删除delete,它会工作,但这会导致内存泄漏。即使我使用boost::scoped_ptr,它也会失败,并出现相同的错误 注意:我还尝试使用soOwned值初始化TStreamAdapter,同样的错误 守则: HRESULT LoadFromStr(TWebBrowser*WB、const UnicodeString和HTML) { 如果(!WB
TStreamAdapter
时,为什么会得到“无效指针操作”?或如何从TStreamAdapter
中正确释放内存?如果我删除delete
,它会工作,但这会导致内存泄漏。即使我使用boost::scoped_ptr,它也会失败,并出现相同的错误
注意:我还尝试使用soOwned
值初始化TStreamAdapter
,同样的错误
守则:
HRESULT LoadFromStr(TWebBrowser*WB、const UnicodeString和HTML)
{
如果(!WB->文档)
{
WB->导航(“关于:空白”);
而(!WB->Document){Application->ProcessMessages();}
}
Delphi接口diDoc=WB->Document;
如果(diDoc)
{
boost::作用域的ptr ms(新的TMemoryStream);
{
boost::scoped_ptr sl(新的TStringList);
sl->Text=HTML;
sl->SaveToStream(ms.get(),TEncoding::Unicode);
ms->Position=0;
}
德尔菲界面;
if(成功(diDoc->QueryInterface(IID_-IPersistStreamInit,(void**)和diPSI))和diPSI)
{
TStreamAdapter*sa=新的TStreamAdapter(ms.get(),sorreference);
diPSI->Load(*sa);
删除sa;//加载(sa);
//Delphi接口在函数结束时自动释放
返回S_OK;
}
}
返回E_失败;
}
更新:我在这里找到了解决方案-
解决办法是使用
\u di_IStream sa(*(新的TStreamAdapter(ms.get(),sorreference))代码>
或
delphisa接口(*(新的TStreamAdapter(ms.get(),sorreference))代码>
因为一旦IStream超出范围,它将自动释放IStream。至少应该是这样的-这里是否存在可能的内存泄漏?(CodeGuard未检测到任何内存泄漏)。TStreamAdapter
是一个TInterfacedObject
子体,它实现了引用计数语义。你根本不应该删除它,当对象不再被任何人引用时,你需要让引用计数释放对象
使用\u di\u IStream
(这只是DelphiInterface
的别名)是使用智能指针自动执行的正确方法TComInterface
和CComPtr
也可以工作。TStreamAdapter
是一个tinterfaceobject
子体,它实现了引用计数语义。你根本不应该删除它,当对象不再被任何人引用时,你需要让引用计数释放对象
使用\u di\u IStream
(这只是DelphiInterface
的别名)是使用智能指针自动执行的正确方法TComInterface
和CComPtr
也会起作用。很高兴是你做了回复-谢谢-因为我希望这个问题也能得到纠正(猜猜删除TStreamAdapter*
的想法来自哪里)。很高兴是你做了回复-谢谢-因为我希望这个问题也能得到纠正(猜猜删除TStreamAdapter*
的想法来自哪里)。