auto_ptr(shared_ptr也是如此)尽量使它们尽可能透明; 也就是说,理想情况下,您不应该区分是否使用auto_ptr或指向对象的实际指针.考虑:
class MyClass
{
public:
void foo() { }
};
MyClass* p = new MyClass;
auto_ptr<MyClass> ap(new MyClassp);
p->foo(); // No notational difference in using real
ap->foo(); // pointers and auto_ptrs
Run Code Online (Sandbox Code Playgroud)
当您尝试通过指向成员的指针调用成员函数时,存在差异,因为auto_ptr显然不实现op - >*():
void (MyClass::*memfun)() = &MyClass::foo;
(p->*memfun)(); // OK
(ap->*memfun)(); // Error op->*() missing
(ap.get()->*memfun)(); // OK
Run Code Online (Sandbox Code Playgroud)
为什么auto_ptr中不支持op - >*()以及如何实现它(我已经实验了一段时间,但最终放弃了).
除了使用auto_ptrs的所有已知好处之外,auto_ptr是什么"最差实践"?
创建auto_ptrs的STL限制器.auto_ptrs不符合'CopyConstructable'要求.另见Scott Meyer的"Effective STL",第8项.
创建数组的auto_ptrs在销毁时,auto_ptr的析构函数使用'delete'(并且永远不会'delete []')来销毁拥有的对象,因此这段代码会产生未定义的行为:auto_ptr api(new int [42]);
不使用auto_ptr成员在类中处理copy-ctor和op =.有人可能天真地认为通过使用auto_ptr成员,不需要为类实现复制构造函数/赋值运算符.然而,即使是一个auto_ptr成员'毒化'一个类(即违反'CopyConstructable'和'Assignable'要求).在复制/分配操作期间,这些类的对象将被部分损坏.
还有更多的auto_ptr陷阱吗?