如果您想捕获库的无效使用(尝试在对象被删除时访问它们)以及拥有高性能 API(API 中没有weak_ptr和shared_ptr),那么您可以考虑使用不同的API用于调试和非调试版本。
为简单起见,我们假设您只公开了一类对象;调用这个类对象。从 API 返回的用于访问内部对象的指针类型定义为:
#ifdef DEBUG
typedef ObjectPtrFacade ObjectPtr
#else
typedef Object * ObjectPtr;
#endif
这里的外观是你写的类。它的工作原理大致如下:
class ObjectPtrFacade {
public:
ObjectPtrFacade(Object *o) : wptr(o) { }
// copy constructor and assignment here etc. (not written)
Object * operator -> () const { return access(); }
Object & operator * () const { return *access(); }
private:
Object * access() {
assert(wptr.use_count() > 0);
return (Object *)(wptr.lock());
}
weak_ptr<Object> wptr;
}
这样,每当您构建调试版本时,都会使用一种特殊类型的智能指针,它在访问对象之前断言其 use_count() 大于零,即该对象仍然存在。如果对象已被释放,您会得到一个失败的断言,这比空指针引用要好。
一般来说,如果你有 API 的“愚蠢”用户,当然使用weak_ptr 并没有帮助,因为他们可以调用lock(),然后在weak_ptr 返回一个空的shared_ptr 之后仍然进行空指针引用。 ..