现在我们讨论下使用返回指针的函数的潜在错误。假设有一个函数返回一个指向某个MyClass类型的对象的指针。
MyClass* MyFactoryClass::Create(const Inputs& inputs);
这个函数的一个非常显而易见的问题是,它的调用者是否负责删除这个对象?或者说这个指针所指向的MyClass类的实例是MyFactoryClass所拥有的实例?这个问题显然应该在声明这个函数的头文件中以注释的形式说明。但在软件的世界里,实际上很少能够做到这样。但是,即使函数的作者确实提供了一个注释,表示这个函数在堆上创建了一个新对象,并且由它的调用者负责删除这个对象,我们将会发现自己面临这样一种处境:每当我们接到一个由函数调用所返回的指向某个对象的指针时,我们需要记得检查注释(或者在没有注释时,检查代码本身)来推断是否由我们负责删除这个对象。正如前面所说的,我们应该更多地依赖编译器而不是程序员。因此,实行这个对象所有权的一种可靠方法是让函数返回一个智能指针。例如:
RefCountPtr<MyClass> MyFactoryClass::Create(const Inputs& inputs);
这种设计使函数所返回的对象的所有权毫无争议,不会留下内存泄露的机会。另一方面&#