visual-c++ - 谁拥有 _bstr_t::wchar_t*、_bstr_t::char* 运算符返回的字符串?

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

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

我需要删除释放它们吗?使用哪个函数?

最佳答案

使用调试器单步执行后,我的结论是不需要手动删除/释放返回的字符串。返回字符串的生命周期由 _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);

关于visual-c++ - 谁拥有 _bstr_t::wchar_t*、_bstr_t::char* 运算符返回的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14474629/

相关文章:

c++ - 如何检测进程的cpu/内存使用情况并在超过一定值时将其杀死?

c# - 从非托管进程卸载 .NET DLL

c++ - 如何仅包含一次文件/防止 C++ 程序中旧 C API 中的函数重新定义

c - 指定驻留在特定地址的类型

iphone - 假人的 ARC 保留周期

c#-4.0 - C# 4、COM 互操作和 UPnP : A trying triumvirate

c# - 如果我通过 COM 接口(interface)更新正在运行的程序所使用的 DLL,会发生什么情况?

c++ - 了解 C++ 示例 - 打印机、句柄、字符串

c++ - make_unique 不编译

c++ - 从 native c++ dll 将 stdout 重定向到 Visual Studio 输出窗口