一个调试问题:Invalid Address specified to RtlSizeHeap,麻烦看看!

NistCK 2006-08-14 09:38:58
下面这段代码, 调试的时候发现Add方法在连续调用几次后便出现: HEAP[MRServer.exe]: Invalid Address specified to RtlSizeHeap( 130000, 146678 ).
不知问题出在哪了? 麻烦高手看看。谢谢!

代码如下:

#include <vector>

//-----------------------------------------------------------------
// Property.CPP
//-----------------------------------------------------------------
class CProperty {
public:
CProperty(){
m_bstrPropName = BSTR("");
m_bstrPropValue = BSTR("");
}
virtual ~CProperty(){}
private:
BSTR m_bstrPropName;
BSTR m_bstrPropValue;
};
//-----------------------------------------------------------------

//-----------------------------------------------------------------
// DataBuffer.H
//-----------------------------------------------------------------
typedef std::vector<CProperty, std::allocator<CProperty> > PROPERTYVECTOR;

class CDataBuffer {
public:
BSTR GetData();
BSTR GetKey();
boolean SetKey(BSTR bstrKey);
boolean SetData(BSTR bstrData);
CDataBuffer(){}
virtual ~CDataBuffer(){}
private:
CComBSTR m_bstrKey;
CComBSTR m_bstrData;
PROPERTYVECTOR m_Prop;
};

// DataBuffer.CPP
boolean CDataBuffer::SetData(BSTR bstrData){
m_bstrData.Attach(bstrData);
return true;
}

boolean CDataBuffer::SetKey(BSTR bstrKey){
m_bstrKey.Attach(bstrKey);
retur true;
}

BSTR CDataBuffer::GetKey(){
return m_bstrKey.Copy();
}

BSTR CDataBuffer::GetData(){
return m_bstrData.Copy();
}
//-----------------------------------------------------------------

//-----------------------------------------------------------------
// Center.H
//-----------------------------------------------------------------
class ATL_NO_VTABLE CCenter :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCenter, &CLSID_Center>,
public IDispatchImpl<ICenter, &IID_ICenter, &LIBID_MRSERVERLib>
{
public:
CCenter(){ }

DECLARE_REGISTRY_RESOURCEID(IDR_CENTER)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CCenter)
COM_INTERFACE_ENTRY(ICenter)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// ICenter
public:
STDMETHOD(Add)(/*[in]*/ BSTR bstrKey, /*[in]*/ BSTR bstrInfo, /*[out,retval]*/ long* pResult);
};

// Center.CPP
typedef std::vector<CDataBuffer, std::allocator<CDataBuffer> > DATAVECTOR;

DATAVECTOR gData;

STDMETHODIMP CCenter::Add(BSTR bstrKey, BSTR bstrInfo,long* pResult){
CComBSTR bstrTmp(bstrKey);
if( bstrTmp.Length() == 0 ){
*pResult = -1;
return S_FALSE;
}
DATAVECTOR::iterator oIterator;
CDataBuffer* pDB = NULL;
CComBSTR thisKey(bstrKey);
for(oIterator = gData.begin(); oIterator != gData.end(); oIterator ++){
pDB = oIterator;
CComBSTR bstr(pDB->GetKey());
if( bstr == thisKey ){
*pResult = -2;
return S_FALSE;
}
}
CDataBuffer oDB;
oDB.SetKey(bstrKey);
oDB.SetData(bstrInfo);
gData.push_back(oDB);
*pResult = gData.size();

return S_OK;
}
//-----------------------------------------------------------------

//-----------------------------------------------------------------
// MRServer.idl
//-----------------------------------------------------------------
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(78E1AFD6-4AD7-4232-8F56-0935BCC82762),
dual,
helpstring("ICenter Interface"),
pointer_default(unique)
]
interface ICenter : IDispatch
{
[id(1), helpstring("method Add")] HRESULT Add([in] BSTR bstrKey, [in] BSTR bstrInfo, [out,retval] long* plResult);
};

[
uuid(70484CAC-5FA6-4863-9FE0-48225B26F940),
version(1.0),
helpstring("MRServer 1.0 Type Library")
]
library MRSERVERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");

[
uuid(E351DEB7-48A8-474E-ABE2-3173BF575298),
helpstring("Center Class")
]
coclass Center
{
[default] interface ICenter;
};
};
//-----------------------------------------------------------------

//-----------------------------------------------------------------
// 调试代码(VB)
//-----------------------------------------------------------------
Private Sub Command1_Click()
Dim obj, i As Long
Dim n As Long
Set obj = CreateObject("MRServer.Center")
n = obj.Add("KEY_2", 6)
Debug.Print "First: " & n
For i = 1 To 9
n = obj.Add("KEY_" & i, "ITME_" & i)
Next
n = obj.Add("KEY_5", "d")
End Sub
//-----------------------------------------------------------------
...全文
312 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wildmen 2006-08-15
  • 打赏
  • 举报
回复
看看 call stack.
ldsjlzy 2006-08-15
  • 打赏
  • 举报
回复
调试进去看哪行有问题
xqk 2006-08-15
  • 打赏
  • 举报
回复
up

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧