2013-01-23 32 views

回答

3

在使用调试器执行实施之后,我的结论是,没有必要手动将返回的字符串delete/free。返回字符串的生命周期在内部由_bstr_t管理。

请参见下面的代码片段从实现:

// Extract a const char_t* 
// 
inline _bstr_t::operator const char*() const throw(_com_error) 
{ 
    return (m_Data != NULL) ? m_Data->GetString() : NULL; 
} 

inline const char* _bstr_t::Data_t::GetString() const throw(_com_error) 
{ 
    if (m_str == NULL) { 
     m_str = _com_util::ConvertBSTRToString(m_wstr); 

     if (m_str == NULL && m_wstr != NULL) { 
      _com_issue_error(E_OUTOFMEMORY); 
     } 
    } 

    return m_str; 
} 

inline void _bstr_t::Data_t::_Free() throw() 
{ 
    if (m_wstr != NULL) { 
     ::SysFreeString(m_wstr); 
    } 

    if (m_str != NULL) { 
     delete [] m_str; 
    } 
} 

它也还可以使用无名_bstr_t如下因为_bstr_t实例后的CString构造已经完成销毁

CString abc((LPCTSTR)_bstr_t(OLESTR("ABC"))); 
AfxMessageBox(abc);