谁拥有从_bstr_t :: wchar_t *,_bstr_t :: char *运算符返回的字符串?

时间:2013-01-23 07:40:14

标签: visual-c++ memory-management com memory-leaks bstr

_bstr_t::wchar_t*, _bstr_t::char* operators返回不同类型的字符串。

我需要delete还是free他们?使用哪个功能?

1 个答案:

答案 0 :(得分: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);