描述:
下面这段代码, 调试的时候发现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
//-----------------------------------------------------------------