请注意拷贝auto_ptr的独特性!
auto_ptr<Widget> pw1(new Widget); // pw1指向一个Widget
auto_ptr<Widget> pw2(pw1); // pw2指向pw1的Widget;
// pw1被设为NULL。(Widget的
// 所有权从pw1转移到pw2。)
pw1 = pw2; // pw1现在再次指向Widget;
// pw2被设为NULL
例如下面排序的例子(C++编译器禁止auto_ptr容器,所以这个例子不能编译通过)
bool widgetAPCompare(const auto_ptr<Widget>& lhs, const auto_ptr<Widget>& rhs) {
return *lhs < *rhs; // 对于这个例子,假设Widget
} // 存在operator<
vector<auto_ptr<Widget> > widgets; // 建立一个vector,然后
// 用Widget的auto_ptr填充它;
// 记住这将不能编译!
sort(widgets.begin(), widgets.end(), widgetAPCompare); // 排序这个vector
这里的所有东西看起来都很合理,而且从概念上看所有东西也都很合理,但结果却完全不合理。例如,在排序过程中widgets中的一个或多个auto_ptr可能已经被设为NULL。排序这个vector的行为可能已经改变了它的内容!值得去了解这是怎么发生的。