永不建立auto_ptr的容器

请注意拷贝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的行为可能已经改变了它的内容!值得去了解这是怎么发生的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值