- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我们有这段代码
_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface) {
Interface* pOldInterface = m_pInterface;
m_pInterface = cp.m_pInterface;
cp.m_pInterface = nullptr;
if (pOldInterface != nullptr) {
pOldInterface->Release();
}
}
return *this;
}
pOldInterface
在 move 分配时是 Release()d
。为什么 move 赋值/构造函数操作没有实现为交换,让 Release()
自然发生在 move 对象的析构函数上,只需使用 nullptr
赋值或 Release()
手动提前触发它?
我总是将 move 构造函数实现为交换操作。这是不好的做法吗?
我的代码是
_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface) {
Interface* pOldInterface = m_pInterface;
m_pInterface = cp.m_pInterface;
cp.m_pInterface = pOldInterface;
// or just std::swap(m_pInterface, cp.m_pInterface);
}
return *this;
}
MS _com_ptr_t
选择背后是否有原因?这个问题也适用于任何 move 分配/构造函数,所以这个上下文或多或少是相关的。这完全取决于我们是发布数据还是交换数据?
最佳答案
I always implement move constructors as swap operations. Is this bad practice?
通常会注意到一个不好的做法,但取决于 Release()
做了什么(在第一个代码中)。如果 Release()
必须在 Interface
move 时处理任何相关对象,则实现可能不同于简单的交换操作。
对于小案例,我个人更喜欢std::exchange
习语(需要 c++14 或更高版本),这在 move 操作中有意义。
_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface)
{
m_pInterface = std::exchange(cp.m_pInterface, nullptr);
}
return *this;
}
关于c++ - 这个 _com_ptr_t move 分配有什么目的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140156/
假设我有一个拥有 D3DDevice 的类: class Thing { public: Thing() { D3D11CreateDevice(..., &devic
我想创建一个库来包装 Excel Automation 并仅公开其大量功能中的一部分。我正在使用 #import 机制来处理 Excel 的 COM,所以现在我有: // EXCELAPP.H #im
我在处理包含在 _com_ptr_t 模板对象中的 COM 对象时遇到一些问题(崩溃)。我需要询问该对象以查看引用计数是多少,因为我非常确定该对象正在过早销毁。 如果我能以某种方式连接到 AddRef
所以我们有这段代码 _com_ptr_t& operator=(_com_ptr_t&& cp) throw() { if (m_pInterface != cp.m_pInterface)
我有一个 ATL 项目,我需要在 CComObjectRootEx::FinalConstruct 中执行各种初始化例程。出于演示目的,请考虑以下实现: HRESULT FinalConstruct(
我有以下代码: int _tmain(int argc, _TCHAR* argv[]) { // Initialize COM. HRESULT hr = CoInitialize(
我正在研究使用 _com_ptr_t::CreateInstance 创建 COM 对象的程序。我没有得到的是,代码无需 regsvr32 引用的 COM dll 即可工作。 唯一的要求是 COM 必
我尝试将 boost::multi_index_container 与 _com_ptr_t 对象一起使用。代码编译时没有警告,但在运行时崩溃。标准容器(std::set、map 等)与此类对象完美配
我有一个 _com_ptr_t 实例化是通过导入一个 .tlb 文件生成的,它在下面使用...... #import "object.tlb" void demo() { IObjectPtr
我是一名优秀的程序员,十分优秀!