1

以下代码在 WebKit 中找到:

RefPtr<Element> element = pendingScript.releaseElementAndClear();
if (ScriptElement* scriptElement = toScriptElement(element.get())) {
    NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel);
    IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_document);
    //Do something else...
    }
}

NestingLevelIncrementer 是一个简单的类,它在构造时增加计数器,在破坏时减少计数器。你可以在这里查看实现。

在这个废料中,我认为这与直接增加和减少数量类似。也许唯一的好处是无论减少数量,而是引入了一个新类。

还有其他使用这种模式的理由吗?

4

1 回答 1

2

目的是无论something else结果如何,都将反转增量;当方法返回或抛出异常时,堆栈变量将被销毁。

其他语言的替代方法将使用try...finally; 有关 C++ 中的 RAII 与 finally 的更多讨论,请参阅此内容:

C++ 是否支持“最终”块?(我一直听到的这个“RAII”是什么?)

于 2013-05-30T06:39:51.600 回答