句柄与智能指针。用什么?

时间:2011-07-17 14:11:51

标签: c++ handle smart-pointers

我开始为实践目的开发图形引擎。出现的第一个问题之一是使用句柄或智能指针来引用我的类实例。

从我的观点来看:

  • 智能指针优点:根据需求创建,他们没有成为过时指针的问题;缺点:因为它们在链表中,搜索指针是O(n)操作。

  • 处理专业人员:搜索是O(1),对象重定位是O(1);缺点:可以成为过时的指针,创建一个新的句柄强制系统检查句柄表中的第一个NULL条目。

选择哪一个?请解释您的选择。

编辑:

我想在你的评论和答案之后澄清一些观点。

我并不是说智能指针是“由STL链表表示”的链表。我的意思是它们在某种程度上表现为链表(如果将一个对象从一个内存块移动到另一个内存块,则需要迭代完整的智能指针列表以正确更新对该对象的所有引用 - 可以使用链表 - )。

我并不认为句柄与不透明指针或指向实现模型的指针完全相同。我的意思是有一个全局句柄表(一个指针数组),所以当我请求一个对象时,我得到一个可解除引用的实例,其中包含该表中可以找到该对象的实际指针的索引。因此,如果我将对象从一个块移动到另一个块,只需更新句柄表中的指针条目,我就可以同时自动更新所有指针。

2 个答案:

答案 0 :(得分:2)

这些定义都不符合通常使用的定义。智能指针完全不在链表中。通常,您需要使用观察者模式来保留原始指针的向量,这些指针指向仍然存在的对象(如果您需要迭代它们或其他东西)。您描述的句柄几乎仅用于二进制兼容性原因而且从不在进行中。

使用智能指针,他们会照顾好自己。

答案 1 :(得分:1)

术语“句柄”是一个广义术语,实质上是指对象的标识符

指针或智能指针属于此定义,因此您需要为选项2选择一个更复杂的术语。

             "Handle"
                 |
          /------+-------\
         /       |         \
        /        |           \
    Pointer    Reference    Other Identififer
       |         |             \
  |----+----|   `T&`             \
  |         |                 |---+------|
 `T*`  `shared_ptr<T>`      Text       Number (e.g. HWND in WinAPI)

如果我认为你的意思是一些固定的,内存抽象的“其他标识符”那么,当然,你可以使用它。您不一定在这里有/或场景。你可能想要使用智能指针无论如何(对于终身管理,如果没有别的),智能指针不需要在链表中。

您可以使用std::map<your_identifier_type, std::shared_ptr<T> >将固定的,用户定义的标识符映射到[可能会发生变化的]智能指针。


免责声明:这张图是匆匆绘制的,代表了我现在对术语树的看法,即起床后半小时。与其他观点可能存在细微的差异,但它应该给出相当可靠的印象。