2

可能重复:
为什么使用“新”会导致内存泄漏?

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

   Player player=*(new Player()); 

和:

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

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

4

2 回答 2

4

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

Player player=*(new Player()); 

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

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

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

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

于 2012-11-12T21:00:09.403 回答
2

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

Player player = *(new Player())

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

另一方面,

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

为新创建的对象创建一个名为 player 的引用。因此,您可以访问该对象。特别是,您可以通过以下方式释放内存并销毁该对象

delete &player;
于 2012-11-12T21:01:32.160 回答