【问题标题】:C++ what does & do in overloaded assignment operator declaration? [duplicate]C++ 在重载赋值运算符声明中 & 做什么? [复制]
【发布时间】:2012-11-01 07:59:48
【问题描述】:

可能重复:
Why does the use of ‘new’ cause memory leaks?

有什么区别(如果有的话):

   Player player=*(new Player()); 

和:

   Player &player=*(new Player());

两者(似乎)表现相同,但我肯定错过了什么?!?

【问题讨论】:

  • 它们的共同点是共享内存泄漏:)
  • 这个问题肯定被问过很多次了吧?
  • @Joe:第二个本质上不是内存泄漏,如果奇怪的话,它可以被正确释放。
  • ....Player player; 有什么问题? :P 看起来有人陷入了 Java 思维模式,没有意识到一个对象可以在你不说 new 的情况下存在。
  • @Joe As Armen's answer says delete &player;

标签: c++ reference


【解决方案1】:

不同之处在于第一个创建副本,而第二个创建对new Player()返回的指针所指向的对象的引用。

Player player=*(new Player()); 

使用复制构造函数复制初始化player

Player &player=*(new Player());

只需为*(new Player()) 创建一个别名,这是有效的,因为new Player() 不是临时的。因此,Player& player = Player() 将是非法的。

它们的相同之处在于它们都很烂

【讨论】:

  • 感谢您的快速回复。为什么第二个很烂?
  • @mipesom 因为内存泄漏(并且修复内存泄漏是丑陋的)并且因为它不是必需的。你可以简单地写Player player = Player() 来达到同样的效果——不需要new
  • @LuchianGrigore:你到底为什么要写Player player = Player();而不是简单地写Player player;
  • @ArmenTsirunyan 保证同样的效果。如果Player是POD类型,则后者不初始化成员,而前者初始化。
  • @LuchianGrigore:我明白了。一个名为 Player 的类是 POD 类型会很奇怪......
【解决方案2】:

new Player() 是在所谓的堆上创建对象(未命名)的表达式。表达式的结果是指向新创建对象的指针。现在当你这样做时

Player player = *(new Player())

您定义了一个名为 player 的变量,它是新创建对象的 副本。此外,您已经失去了对堆对象的所有句柄(访问),并且您永远无法释放它占用的内存。

另一方面,

Player &player=*(new Player());

为新创建的对象创建一个名为播放器的引用。因此,您可以访问该对象。特别是,您可以通过

释放内存并销毁该对象
delete &player;

【讨论】:

  • 我正要写同样的东西,但你实际上可以在第一种情况下释放内存(当然,以一种丑陋、丑陋的方式,但仍然可能)。
  • @LuchianGrigore:怎么样?你引起了我的兴趣:)
  • 好吧,如果你有Player的复制构造函数持有对原始对象的引用,你可以像delete &player;一样删除它。
  • @LuchianGrigore:啊......我认为这个技巧可以在不接触 Player 类型的情况下完成......
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 2020-03-23
  • 2012-08-17
  • 2012-04-27
  • 1970-01-01
  • 2020-04-09
  • 2013-03-30
  • 2016-08-30
相关资源
最近更新 更多