2010-08-02 91 views
5

我刚刚完成Koenig & Moo的加速C++和章13 & 14他们提出了一些Handle类(简单的,共享的,引用计数)的想法和实现。手柄与智能指针相同吗?

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

这些章节中介绍的类是否基本实现了智能指针?智能指针对我来说还是很新的,但从我了解的这些Handle类执行相同的功能。

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

编辑

我要补充的是,他们在这些章节开发类是模板类,因此他们不会绑定到特定的资源,如它们不是设计,例如特定的文件句柄类。

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

回答

6

从您的描述中,它听起来像一个智能指针。
虽然我个人不会使用术语句柄,因为它稍微模糊(只需将智能指针称为智能指针)。

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

问:你应该写自己的智能指针。 A:不是。它比你想象的要复杂得多。即使书中的描述只是掩盖了更复杂的问题。坚持由知名图书馆提供的标准图书。

问:处理是什么意思。
答:它用来表示指向指针的指针。但是这个术语多年来一直不明朗,因为这个术语已被重复使用。但是你可以把它看作一个指向资源的指针,其中的资源可以被其他方法访问,在这种情况下,它们的描述是有效的。

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

问:你应该从业务逻辑中抽象出内存管理:
答:这是一个棘手的问题,有些人可能会不同意。但我会永远说。一个班级应该做一件事。事情是资源管理或业务逻辑。将这两条线索结合起来也是无法预料的复杂性。

+0

谢谢!特别欣赏最后两个问答。我在那个阶段,我觉得我不再是新手了,但我错过了那种具有经验的更高层次,设计选择/哲学洞察力。 干杯。 – MTLPhil 2010-08-02 16:30:38

1

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

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

所以,是的,我有几次写我自己的句柄类。

+0

我认为你试图解决的问题是句柄是* opaque *指针(并且可能或可能不聪明,通常实际上并不是这样)。 – 2010-08-02 16:16:07

+0

@Ben,是的,这是一个很好的说法。随意编辑,如果你认为它需要它。 – djna 2010-08-02 16:22:24

2

如果你会原谅一些隐喻的C++,这种关系就像是:class smart_pointer : public handle;。智能指针是一个句柄,它在句柄和它处理的任何内容之间提供特定的(类似指针的)接口风格。一个不是智能指针的句柄通常会有(至少隐约)类似的操作,但它们的接口可能完全不同。

在某些时候,有人显然必须编写智能指针类(es)。同时,这不是轻率承担的事情。除非你有精确的规格,否则你可能会得到至少一些细节错误 - 而且“非常精确的规格”只会降低赔率到50:50左右...

OTOH,它仍然不像设计智能指针那么糟糕。这在极端情况下往往是棘手的。举一个明显的例子,auto_ptr在标准化过程中经过了多次设计和重新设计,但它在现实生活中仍然看不到多少用处,并且已经在C++ 0x中弃用了(取而代之的是std::unique_ptr,它是一个lot的工作,辩论,并没有少量的实验和测试)。

+0

我总是为一些隐喻的C++ :) – MTLPhil 2010-08-02 16:33:23