句柄是否与智能指针相同?

时间:2010-08-02 16:07:05

标签: c++ smart-pointers handle

我只是做完Koenig& Moo的加速C ++和第13章和第13章14他们列出了一些Handle类的想法和实现(简单,共享,引用计数)。

这些类包含一个原始指针,并从客户端代码中抽象出动态对象的分配/释放,以避免原始指针的所有危险,并允许用户取消引用它们以访问指向的对象。基本上是一种与原始内存资源接口的“更安全”方式。

这些章节中介绍的类是否基本上是智能指针的实现?智能指针对我来说仍然是一个新手,但据我所知,这些Handle类正在执行相同的功能。

  1. 两者之间是否存在区别,还是同一事物的另一个名称?
  2. 假设它们在功能上是等价的,实际上这样的类会从头开始写而不是使用已经制作的智能指针解决方案吗?
  3. 修改

    我应该补充一点,他们在这些章节中开发的类是模板类,因此它们不受特定资源的约束,例如,他们没有设计特定的FileHandle类。

    第一个代码段here,7.1中的代码几乎就是我所指的章节中的代码。

3 个答案:

答案 0 :(得分:6)

根据您的描述,它听起来像一个智能指针 虽然我个人不会使用术语句柄,因为它有点含糊不清(只需将智能指针称为智能指针)。

问:你能从头开始写一个智能指针吗? 答:是的

问:你应该写自己的智能指针吗? 答:没有。它比你想象的要复杂得多。甚至书中的描述也只是掩盖了更为复杂的问题。坚持信誉良好的图书馆提供的标准文件。

问:处理它的意思。
答:它曾经是指指针的指针。但随着该术语的重复使用,这个词多年来一直模糊不清。但您可以将其视为指向资源的指针,其中资源可以通过其他方法访问,在此上下文中,它们的描述是有效的。

问:你应该使用智能指针而不是原始内存吗? 答:永远不要使用RAW内存,除非绝对必要(实际上从来没有)总是将其封装在管理它的类中。该类是智能指针还是其他类型的对象是一个很好的问题。 std :: vector不被认为是智能指针,但它封装了一个RAW指针。

问:你应该从业务逻辑中抽象内存管理:
答:这是一个棘手的问题,有些人可能不同意。但我会永远说。一堂课应该做一件事。事情是资源管理或业务逻辑。结合这两个导致太不可预见的复杂性。

答案 1 :(得分:2)

如果您原谅了一些隐喻的C ++,那么关系就像:class smart_pointer : public handle;。智能指针是一个句柄,它在句柄和它处理的任何东西之间提供特定的(类似指针)样式的接口。不是智能指针的句柄通常会(至少含糊不清)类似的操作,但它们的界面可能完全不同。

在某些时候,有人显然必须编写智能指针类。与此同时,这不是轻率的事情。除非你有一个极其精确的规范,否则你可能至少会得到一些错误的细节 - 而且“非常精确的规范”只会将概率降低到大约50:50 ......

OTOH,它仍然没有设计智能指针那么糟糕。这在极端情况下往往是棘手的。对于一个明显的例子,auto_ptr在标准化过程中被设计和重新设计了很多次,但它在现实生活中仍然看到相对较少的用途,并且已经在C ++ 0x中被弃用(由{{1取代) },这是很多的工作,辩论,以及不少的实验和测试的产物。)

答案 2 :(得分:1)

我会说句柄是一个比智能指针更通用的概念。

例如,考虑文件句柄。文件句柄实际上可以是指向表示打开文件的数据结构的智能指针,但客户端并不真正将其视为指针,而只是将句柄传递给API。

所以,是的,我曾多次编写自己的句柄类。