从百度百科里可以知道
CString.AllocSysString()的内存释放是通过SysFreeString()函数来进行,今天在使用一个第三方库的时候有下列语句导致了内存泄露
构造函数
CString name;
_bstr_t m_name = name.AllocSysString();
析构函数
::SysFreeString(m_name);
究其原因是因为AllocSysString返回的是BSTR类型的变量,而_bstr_t和BSTR并不是同一种类型的变量,_bstr_t m_name = name.AllocSysString();的过程中实际上丢失了一个返回类型是BSTR的临时变量,而SysFreeString并不能通过_bstr_t 来释放变量(虽然编译没报错)
可以用如下代码来类比
char *MyAllocSysString()
{
char *pstr = new char[100];
strcpy(pstr, "hello world");
return pstr;
}
string strstr = MyAllocSysString();
delete strstr; //当然delete strstr;是行不通的
//上面的伪代码造成了内存泄露,因为strstr虽然获得了hello world的赋值,但是返回的char *指针却丢失了,正确的做法应该是
char *pstr = MyAllocSysString();
string strstr = pstr;
delete pstr;
//回到BSTR和_bstr_t就应该是
BSTR m_name_addr = name.AllocSysString();
m_name = m_name_addr;
析构函数
::SysFreeString(m_name_addr );