- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在下面的代码片段中(循环的简化场景)
_bstr_t original(OLESTR("MyString")); // ref-count = 1
_bstr_t another;
another = original; // ref-count = 2
// do something with another
another.Assign(NULL); // expected: ref-count = 1, and another = NULL
// reset another to NULL before doing other operations
在 another.Assign(NULL)
之后我期望的是:
SysFreeString()
未被调用另一个
设置为NULL
original
有 ref count=1
和现有的 BSTR
内容。发生了什么:
SysFreeString()
为 another
和 original
的底层 BSTR
调用另一个
设置为NULL
original
的引用计数保持为 2 another.Assign(NULL)
似乎为 original
和 another
释放了底层 BSTR
。< br/>我们遇到了意外崩溃,因为在编码期间我认为 _bstr_t::Assign()
会减少引用计数,而不是直接释放 BSTR
。
如何在不影响 original
的情况下正确地将 another
重置为 NULL
?
请从 VC++ 6
中找到 Assign
的以下实现。
// assignment operator copies internal data and increases reference count
inline _bstr_t& _bstr_t::operator=(const _bstr_t& s) throw()
{
const_cast<_bstr_t*>(&s)->_AddRef();
_Free();
m_Data = s.m_Data;
return *this;
}
// but _bstr_t::Assign() calls _bstr_t::Data_t::Assign()
// without touching ref count
inline void _bstr_t::Assign(BSTR s) throw(_com_error)
{
if (m_Data != NULL) {
m_Data->Assign(s);
}
else {
m_Data = new Data_t(s, TRUE);
if (m_Data == NULL) {
_com_issue_error(E_OUTOFMEMORY);
}
}
}
// it calls _bstr_t::Data_t::_Free() instead of _bstr_t::_Free() !
inline void _bstr_t::Data_t::Assign(BSTR s) throw(_com_error)
{
_Free();
if (s != NULL) {
m_wstr = ::SysAllocStringByteLen(reinterpret_cast<char*>(s),
::SysStringByteLen(s));
}
}
// this _Free() straight away deallocates the BSTR!
inline void _bstr_t::Data_t::_Free() throw()
{
if (m_wstr != NULL) {
::SysFreeString(m_wstr);
}
if (m_str != NULL) {
delete [] m_str;
}
}
// properly decrements ref count
inline void _bstr_t::_Free() throw()
{
if (m_Data != NULL) {
m_Data->Release();
m_Data = NULL;
}
}
最佳答案
_bstr_t::Assign()
的实现已更新,如 Igor Tandetnik 所述在他的 comment .
这是 VS2010 中的实现,它按预期工作:
inline void _bstr_t::Assign(BSTR s)
{
_COM_ASSERT(s == NULL || m_Data == NULL || m_Data->GetWString() != s);
if (s == NULL || m_Data == NULL || m_Data->GetWString() != s)
{
_Free();
m_Data = new Data_t(s, TRUE);
if (m_Data == NULL) {
_com_issue_error(E_OUTOFMEMORY);
}
}
}
关于c++ - 如何正确地将 _bstr_t 重置为 `NULL`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17804546/
_bstr_t::wchar_t*, _bstr_t::char* operators返回不同类型的字符串。 我需要delete或 free他们?使用哪个功能? 最佳答案 使用调试器逐步实现后,我的结
我有一些读取文件的代码,但它使用的是 std::string,我需要使用 _bstr_t下面的代码可以正常工作。如何改变类型? std::ifstream inFile("QdatPassWor
我有一个 C++ 代码。但它没有正确释放内存。告诉我哪里错了,这是我的代码 1 void MyClass::MyFunction(void) 2 { 3 for (int i=0; i查看->选
多年来我一直在使用这个类(class),它总是“就在那里”。前几天我创建了一个新项目,没有明确做任何事情,这个类是可用的。 现在另一个新项目提示它不知道。两个项目都有相同的#includes。 这两个
我这里有一件奇怪的事。我正在连接 _bstr_t字符串以组装 SQL 命令。 _bstr_t strSQL = a+b+k+hk+Allin+hk+k+hk ...等等。 当我将它打印到控制台时(使
我有一些带有 COM 字符串操作的源代码,但是这些代码让我感到困惑 _bstr_t btLeft; _bstr_t tempData ; _bstr_t btRight ; //Do somethin
我有一个正在开发的 COM DLL,但遇到了一些问题。我有一个 try catch 围绕一个代码块,在 catch 中我从异常中得到一个 _bstr_t。我想做的是捕获该异常并将其打印到一个字符串中,
我正在尝试使用 c 在 excel 中绘制一系列图。问题是当我尝试循环制作绘图时,我必须更改 excel 中工作表的名称。但是这些名称是 _bstr_t 格式的: pSheet->Name =
我知道我可以通过以下方式创建一个带有 float 的 _bstr_t: mValue = _bstr_t(flt); 我可以通过首先声明一个 c 字符串来格式化浮点字符串: char* str = n
第一的: LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v; printf("%s\n", asdfsdf); 第二: printf("%s\n", (LPCTSTR)(_b
我有一个键类型为 _bstr_t 的无序映射。因此,由于哈希函数默认不支持这种键类型,因此我定义了仿函数: struct KeyHash { size_t operator()(const _
我来自 Java,所以我对 C++ 中的许多类型的字符串感到困惑 我有一个函数输入: functionTest(_bstr_t *params) {...} 然后我有一个变量声明为: CString
我有一个 Windows 代码,我想移植到 Linux。在一个地方它使用 _bstr_t。我想知道是否有可用的最小 _bstr_t 端口。我四处寻找 - 但没找到。 我要移植的windows代码是这样
在下面的代码片段中(循环的简化场景) _bstr_t original(OLESTR("MyString")); // ref-count = 1 _bstr_t another; another =
我有 char* 数组,我正在为其动态分配内存。 char *strData = new char[length+1]; 这个 char* 我传递给 _bstr_t,如下所示, _bstr_t bst
我有一个 _bstr_t 变量 bstrErr 并且我有一个 CString 变量 csError。如何将 bstrErr 中的值设置为 csError? 最佳答案 难道就不能投吗: _bstr_t
谁能解释上面提到的类型之间的区别以及一些示例用法以清楚地解释两者之间的区别? 任何帮助将不胜感激!注意:这个问题是 this other question 的衍生问题。 最佳答案 BSTR 是 COM
举个简单的例子: _bstr_t smartString(L"MyString"); Process(smartString); // takes BSTR. 最初我认为 _bstr_t 有一个从 _
我尝试解密给定文件,但存储的内容是使用 _bstr_t 类在 C++ 中完成的。我已经搜索了 2 个小时,测试了所有内容,但我仍然没有得到正确的结果:reading Korean _bstr_t'd
这段代码不会产生错误吗: _bstr_t text=n.GetText(); atof((char*)text) 其中文本是 double 值。 我知道 _bstr_t 在转换中产生一个 const
我是一名优秀的程序员,十分优秀!