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*
的想法来自哪里)。