【问题标题】:What is the problem with using a shallow copy in a copy assignment operator? [duplicate]在复制赋值运算符中使用浅拷贝有什么问题? [复制]
【发布时间】:2021-11-28 01:24:33
【问题描述】:

我的计算机科学教授的问题提出了一个有趣的问题,我很好奇它的答案是什么。

您的复制赋值运算符对数组进行了浅拷贝。为什么这是有问题的?提供一个可能导致您的程序出错的场景。

首先,我知道复制赋值运算符用于将一个对象的数据复制到另一个对象,通常使用深拷贝,但我不确定使用浅拷贝会出现什么问题。

【问题讨论】:

  • 提示:如果数组分配在堆上会发生什么?
  • 听起来你的教授听不懂Rule of Three。如果你的析构函数理解浅拷贝,它们就不是问题。
  • 根据 Silvio Mayolo 的评论,您需要确定 who owns the array?
  • 这个问题需要更多的上下文,因为它假设了你的课程。 (也许这个问题是针对特定类的,而不是作为一般查询?)浅拷贝本身不足以导致错误。举个简单的例子,假设你愿意泄漏内存。如果你的析构函数不释放资源,那么浅拷贝在任何情况下都不会导致错误。还需要一些东西,一个浅拷贝加上你的实现中的其他东西。

标签: c++


【解决方案1】:

教授的问题要求一个数组的浅拷贝导致错误的场景。违反Rule of 3/5/0就是这样的场景。

简而言之,规则 3 表明,如果一个类实现了复制构造函数、复制赋值运算符或析构函数,它可能需要全部 3。规则 5 对此进行了扩展,包括移动构造函数和移动赋值运算符.

在深拷贝场景中,每个对象都将在内存中拥有自己的数组。复制构造函数和复制赋值运算符将制作源对象当前数组的完整副本。析构函数将释放该副本。对象对其自身数组的任何修改都不会影响任何其他对象。

在浅拷贝场景中,每个对象将共享指向内存中单个数组的指针。复制构造函数和复制赋值运算符会将源对象的指针复制到数组。对数组的修改将影响指向该数组的所有对象。问题是当没有明确定义哪个对象拥有该数组时。如果所有这些对象都认为自己拥有该数组,则析构函数都会尝试多次释放相同的内存,这是未定义的行为,可能会破坏内存,导致崩溃等。但如果它们都没有拥有所有权,则数组将被全部销毁后泄露。

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多