C++中智能指针的破坏性复制机制

C++中智能指针的破坏性复制机制

破坏性复制是这样一种机制,即在智能指针被复制时,将对象的所有权转交给目标指针并重置原
来的指针。

destructive_copy_smartptr <SampleClass> smartPtr (new SampleClass ());
SomeFunc (smartPtr); // Ownership transferred to SomeFunc
// Don't use smartPtr in the caller any more!

虽然破坏性复制机制使用起来并不直观,但它有一个优点,即可确保任何时刻只有一个活动指针
指向对象。因此,它非常适合从函数返回指针以及需要利用其“破坏性”的情形。
程序清单 26.3 是一种破坏性复制指针的实现,它没有采用推荐的标准 C++编程方法。

std::auto_ptr 是最流行(也可以说是最臭名昭著,取决于您如何看)的破坏性复制指针。
被传递给函数或复制给另一个指针后,这种智能指针就没有用了。 C++11 摒弃了
std::auto_ptr,您应使用 std::unque_ptr,这种指针不能按值传递,而只能按引用传递,因
为其复制构造函数和复制赋值运算符都是私有的。

0: template <typename T>
1: class destructivecopy_ptr
2: {
3: private:
4: T* object;
5: public:
6: destructivecopy_ptr(T* input):object(input) {}
7: ~destructivecopy_ptr() { delete object; }
8:
9: // copy constructor
10: destructivecopy_ptr(destructivecopy_ptr& source)
11: {
12: // Take ownership on copy
13: object = source.object;
14:
15: // destroy source
16: source.object = 0;
17: }
18:
19: // copy assignment operator
20: destructivecopy_ptr& operator= (destructivecopy_ptr& source)
21: {
22: if (object != source.object)
23: {
24: delete object;
25: object = source.object;
26: source.object = 0;
27: }
28: }
29: };
30:
31: int main()
32: {
33: destructivecopy_ptr<int> num (new int);
34: destructivecopy_ptr<int> copy = num;
35:
36: // num is now invalid
37: return 0;
38: }

分析:
程序清单 26.3 演示了基于破坏性复制的智能指针实现。第 10~17 行和第 20~28 行分别是复制构
造函数和赋值运算符。这些函数实际上使源指针在复制后失效,即复制构造函数在复制后将源指针设
置为 NULL,这就是“破坏性复制”的由来。赋值运算符亦如此。因此在第 34 行被赋给另一个指针后,
num 就不再有效,这种行为不符合赋值操作的目的。

对破坏性复制智能指针的实现来说,程序清单 26.3 所示的复制构造函数和复制赋值运算
符至关重要,但也深受诟病。不同于大多数 C++类,该智能指针类的复制构造函数和赋
值运算符不能接受 const 引用,因为它在复制源引用后使其无效。这不仅不符合传统复
制构造函数和赋值运算符的语义,还让智能指针类的用法不直观。复制或赋值后销毁源
引用不符合预期。鉴于这种智能指针销毁源引用,这也使得它不适合用于 STL 容器,如
std::vector 或其他任何动态集合类。这些容器需要在内部复制内容,这将导致指针失效。
由于种种原因,不在程序中使用破坏性复制智能指针是明智的选择。

C++标准一直支持 auto_ptr,它是一种基于破坏性复制的智能指针。 C++11 终于摒弃了该
智能指针,现在您应使用 std::unique_ptr。
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值