相关疑难解决方法(0)

为什么我不应该在"删除"之后尝试使用"this"值?

C++的这一段中,delete this讨论了构造的使用.列出了4个限制.

限制1到3看起来很合理.但是为什么限制4在那里我"必须不检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情"?

我的意思this是又一个指针.为什么我不能把reinterpret_castint或者叫它printf()输出它的值?

c++ undefined-behavior

27
推荐指数
3
解决办法
1927
查看次数

使用"删除此"符合C++标准的程度如何?

在对象中实现引用计数时,"release and possible delete object"原语通常如下所示实现:

void CObject::Release()
{
    --referenceCount;
    if( referenceCount == 0 ) {
       delete this;
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,delete this看起来很吓人.但由于成员函数立即返回并且不尝试访问任何成员变量,所以这些东西仍然可以正常工作.至少这是通常解释的方式.成员函数甚至可以调用一些全局函数来写入删除对象的日志.

C++标准是否保证成员函数可以调用delete this然后执行任何不需要访问成员变量和调用成员函数的事情,这将被定义为正常行为?

c++

3
推荐指数
1
解决办法
398
查看次数

IUnknown.Release标准实现竞争条件?

以下是实现IUnknown COM接口的Release方法的标准(不推荐)方法(直接取自MSDN):

ULONG CMyMAPIObject::Release()
{
    // Decrement the object's internal counter.
    ULONG ulRefCount = InterlockedDecrement(m_cRef);
    if (0 == m_cRef)
    {
        delete this;
    }
    return ulRefCount;
}
Run Code Online (Sandbox Code Playgroud)

我想知道如果公寓模型不是STA,是否会出现竞争条件:

  • 说剩下一个参考
  • 线程1通过调用Release释放它
  • 它运行并在之前停止 delete this
  • 线程2被调度并获得对该对象的新引用,例如通过调用QueryInterfaceAddRef
  • 线程1继续执行并运行 delete this
  • 线程2留有无效对象

对我来说,确保一致性的唯一方法是创建一个标志,比如删除,锁定整个关键部分,即除了返回之外的所有Release方法,并将标志设置为true.

并在AddRefQueryInterface方法中检查此标志,如果已设置,则拒绝新引用的请求.

我错过了什么?

提前致谢.

c++ windows com winapi multithreading

2
推荐指数
1
解决办法
843
查看次数

标签 统计

c++ ×3

com ×1

multithreading ×1

undefined-behavior ×1

winapi ×1

windows ×1