سؤال

_bstr_t::wchar_t*, _bstr_t::char* operators return string of different types.

Do I need to delete or free them? using which function?

هل كانت مفيدة؟

المحلول

After stepping the implementation using debugger, my conclusion is that there is no need to manually delete/free the returned string. The lifetime of the returned string is managed by _bstr_t internally.

See the following snippets from the implementation:

// 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;
    }
}

It is also okay to use unnamed _bstr_t as follows because _bstr_t instance is destroyed after the constructor of CString has finished.

CString abc((LPCTSTR)_bstr_t(OLESTR("ABC")));
AfxMessageBox(abc);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top