// Now All Things are packed in to the Object
obj.Name = bstrName;
obj.Name2 = bstrname2;
我不太明白你所说的东西被打包是什么意思,因为你只是复制指向字符串的指针,而当你调用 SysFreeString obj.Name 和 obj.Name2 时,它将指向无效的内存块。尽管此代码不安全,但看起来问题的根源是 CFoo 类。您应该向我们展示您的代码的更多详细信息
我建议您使用 CComBSTR 类,它将负责释放内存。
UPDATE
#include <atlbase.h>
using namespace ATL;
...
{
CComBSTR bstrname(_T("Some Name"));
CComBSTR bstrname2(_T("Another Name"));
// Here one may work with these variables if needed
...
// Copy the local values to the Obj's member Variable
bstrname.Copy(&obj.Name);
bstrname2.Copy(&obj.Name2);
}
UPDATE2首先,应该在该块中使用 SysFreeString 释放 bstrCity 和 bstrStreetName 或使用 CComBSTR 代替:
if (SUCCEEDED(hr))
{
BSTR bstrStreet = ::SysAllocString(table.m_pRecordData->Street);
pAddress->put_StreetName(bstrStreet);
BSTR bstrCity = ::SysAllocString(table.m_pRecordData->City);
pAddress->put_CityName(bstrCity);
// SysFreeString(bstrStreet)
// SysFreeString(bstrCity)
}
考虑放大循环条件 !iRet,其中 iCount
for(...; !iRet /* && (iCount < lRecCount) */; ...)
也在这里:
m_sCityName = ::SysAllocString(bstrCityName);
您分配内存但从未释放它,因为 CComBSTR& 运算符 = (OLESTR ..) 本身会分配新的存储空间。应该重写如下:
m_sCityName = bstrCityName;
其他一切对我来说看起来都不错
UPDATE3嗯,堆损坏通常是在分配的内存块之外写入某些值的结果。假设您分配一个长度为 5 的数组并将一些值放入第 6 个位置