【问题标题】:when assignment operator vs copy constructor is invoked? [duplicate]何时调用赋值运算符与复制构造函数? [复制]
【发布时间】:2017-09-03 09:56:46
【问题描述】:

在以下情况下无法理解赋值运算符、复制构造函数和构造函数的使用位置,帮助?

场景 #1

ObjectType newObj = *new ObjectType;

场景 #2

newObj = theObj;

【问题讨论】:

  • 在代码中放置内存泄漏是个坏主意。

标签: c++


【解决方案1】:

场景 #1

ObjectType newObj = *new ObjectType;

按以下顺序使用这些函数:
构造函数
复制构造函数

场景 #2

newObj = theObj;

按以下顺序使用这些函数:
赋值运算符

【讨论】:

  • 很好的答案和重点。我还想指出,场景 1 很糟糕,因为您在堆上分配了一个对象,而没有将指针保存在任何地方。这意味着您每次运行该行时都会失去记忆。
  • @AnthonyD。你能详细说明你的意思吗?指针不是保存在对象“newObj”中吗?
  • @jjohns 不是指针。 C++ 有指针和值的概念。 存储在newObj 中,该值是通过取消引用指针获得的。但是,我们不跟踪指针本身。
  • @AnthonyD。我不确定我是否正确地说明了这一点,如果我错了,请纠正我,所以你说的是“*new ObjectType”将分配一个“ObjectType”类型的新对象,并且还会为内存分配空间指向该新对象的指针。但是随后对象本身会得到另一个指针,该指针被称为“newObj”,但原始指针仍然存在并且没有被任何东西引用?
  • 任何时候你new但不delete同一个对象,你就有内存泄漏。 ObjectType newObj = *new ObjectType; 调用 new 创建一个对象,然后使用复制构造函数创建第二个对象,但第一个对象丢失并且永远不会被破坏。为了正确地delete 它,您已经无法到达第一个对象。
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多