我只是做完Koenig& Moo的加速C ++和第13章和第13章14他们列出了一些Handle类的想法和实现(简单,共享,引用计数)。
这些类包含一个原始指针,并从客户端代码中抽象出动态对象的分配/释放,以避免原始指针的所有危险,并允许用户取消引用它们以访问指向的对象。基本上是一种与原始内存资源接口的“更安全”方式。
这些章节中介绍的类是否基本上是智能指针的实现?智能指针对我来说仍然是一个新手,但据我所知,这些Handle类正在执行相同的功能。
修改
我应该补充一点,他们在这些章节中开发的类是模板类,因此它们不受特定资源的约束,例如,他们没有设计特定的FileHandle类。
第一个代码段here,7.1中的代码几乎就是我所指的章节中的代码。
答案 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。
所以,是的,我曾多次编写自己的句柄类。