【问题标题】:C++ copy constructor, with pointers [closed]C ++复制构造函数,带有指针[关闭]
【发布时间】:2016-04-08 11:48:35
【问题描述】:

当我们定义复制构造函数时,是否需要清除我们正在写入的对象的内容?我正在实现一个二叉搜索树,并且想知道除非我在实现复制构造函数和赋值运算符时清理它,否则我是否不会发生内存泄漏。

【问题讨论】:

  • 清除什么?还没建好,没有什么要清理的。
  • 不清楚你在问什么。只需确保任何分配都与一个释放配对(new/delete、new[]/delete[]、malloc/free、...)
  • 如果您正在定义一个复制构造函数,那么当您从头开始构建时,就没有什么需要清理的了。
  • 你在写什么对象?在对象创建时调用构造函数。
  • 您是否将复制构造函数与赋值运算符混淆了?

标签: c++ copy-constructor assignment-operator


【解决方案1】:

当我们定义复制构造函数时,是否需要清除我们正在写入的对象的内容?

在构建时没有需要覆盖的内容。只需确保您在构造函数成员初始化器列表中执行成员变量的所有副本,而不是在构造函数的主体中执行。

否则编译器会为成员生成默认初始化,然后可能会分配一些东西,实际上需要清除和覆盖(或深度复制)。

尤其是当您像您声称的那样处理指针时。

您最好关注The Rule of Three (Five) 以确保一切顺利。

【讨论】:

  • 赞成通过让成员参与进来,真正理解这个看似毫无意义的问题。
  • @SergeyA:我会尽量不要把它当成个人。
  • @LightnessRacesinOrbit,你是怎么想到的?我要解决的红鲱鱼评论发生了什么?
  • @SergeyA:我出现在照片中是因为你不想也支持我的回答:(
  • @SergeyA:我没有说声誉!
【解决方案2】:

正如其他人所说,使用复制构造函数将创建一个新对象。
您必须考虑什么:
如果您的原始对象是其他一些数据的所有者,例如foo* 分配有newshared_ptr,复制对象只会复制指针及其地址。
您实际上不会复制拥有的数据。
如果你的析构函数中有一个原始的foo* 和一个delete foo,被销毁的第二个对象将尝试删除已移除的内存。

【讨论】:

    【解决方案3】:

    如果复制构造函数正在运行,则没有“我们正在写入的对象”。您正在从头开始创建(“构造”)一个新对象,但从其他对象复制数据以填充其初始状态。

    对于赋值运算符,是的,这绝对是一个考虑因素,您需要确保避免泄漏。但是,如果您使用 RAII,因此您没有任何手动内存管理,那么您无需担心。 (除此之外,我不明白指针是如何进入它的。)

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多