这个CComSafeArray使用不好吗?
Is this CComSafeArray usage bad?
本文关键字:CComSafeArray 这个 更新时间:2023-10-16
有一个COM函数:
GetData(SAFEARRAY ** pRetVal)
和以下遗留代码:
CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&saDataArray.m_psa);
SafeArrayLock(saDataArray);
我怀疑手动管理锁是否好。当m_psa
被GetData
返回为NULL
时,代码会崩溃吗?
下面的代码如何?这样好点了吗?
LPSAFEARRAY psa;
CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&psa);
saDataArray.Attach(psa);
编辑:我测试了上面的两个代码。有一点不同。如果GetData
返回NULL
,直接Attach
而不检查NULL
会调用异常。第一个版本将返回一个E_INVALIDARG
。我的问题仍然存在,你更喜欢后来的版本,因为它使用SafeArray对象来维护计数,而不是混合它?
EDIT2: 如果出于某种原因我选择了第一个版本,可以忽略E_INVALIDARG
返回值吗?当一些代码以后使用这个saDataArray
时,这会有任何副作用吗?
您写的:
SafeArray * psa; CComSafeArray<double> saDataArray; hr = pmyInterface->GetData(&psa); saDataArray.Attach(psa);
但是我认为实际的代码应该是:
LPSAFEARRAY psa; // not "SafeArray *"
hr = pmyInterface->GetData(&psa);
CComSafeArray<double> saDataArray;
saDataArray.Attach(psa);
详情请参见此问题。
EDIT:根据你的问题编辑更新答案
我真的不喜欢你的第一个代码:
CComSafeArray<double> saDataArray; hr = pmyInterface->GetData(&saDataArray.m_psa); SafeArrayLock(saDataArray); // <--- Explicit lock on a CComSafeArray-wrapped array
事实上,一旦原始的SAFEARRAY
给了一个c++ RAII包装器(CComSafeArray
),从那时起,我只会使用这个包装器和它的方法来操作数组。
如果你想对数组进行"手动"处理,只需从c++包装器中.Detach()
它,并使用Win32 API函数调用。但是在我看来,混合两者并不是高质量的代码。
注意第二种方法是不同的,因为您首先使用原始的SAFEARRAY
,使GetData()
方法填充它,然后您将其.Attach()
到CComSafeArray
c++ RAII包装器,将所有权("移动语义")转移到该包装器。然后就可以使用包装器方法来操作数组了。
此外,在生产质量代码中,我不会忽略错误HRESULT
s。
相关文章:
- 有人能分解一下这个c++模板的语法吗
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么在这个代码结束循环中没有得到结束
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何在BST的这个简单递归实现中消除警告
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 这个指针在c++中的用法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 书中的这个例子不好吗
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 为什么这个音频包络不能通过开关的情况?
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么 gcc 编译这个而 msvc 没有
- 这个函数哪里出错了
- 有人能帮我理解这个c++代码吗
- 有人能帮我处理这个链接列表吗?C++
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 这个CComSafeArray使用不好吗?