可能重复:
为什么使用“新”会导致内存泄漏?
(如果有的话)有什么区别:
Player player=*(new Player());
和:
Player &player=*(new Player());
两者(似乎)表现相同,但我肯定错过了什么?!?
可能重复:
为什么使用“新”会导致内存泄漏?
(如果有的话)有什么区别:
Player player=*(new Player());
和:
Player &player=*(new Player());
两者(似乎)表现相同,但我肯定错过了什么?!?
不同之处在于第一个创建副本,而第二个创建对由返回的指针指向的对象的引用new Player()
。
Player player=*(new Player());
player
使用复制构造函数进行复制初始化。
Player &player=*(new Player());
只是创建一个别名*(new Player())
,这是有效的,因为new Player()
它不是临时的。Player& player = Player()
因此将是非法的。
它们的相同之处在于它们都很烂。
new Player()
是在所谓的堆上创建对象(未命名)的表达式。表达式的结果是指向新创建对象的指针。现在当你做
Player player = *(new Player())
您定义了一个名为 player 的变量,它是新创建的对象的副本。此外,您已经失去了对堆对象的所有句柄(访问),并且您永远无法释放它占用的内存。
另一方面,
Player &player=*(new Player());
为新创建的对象创建一个名为 player 的引用。因此,您可以访问该对象。特别是,您可以通过以下方式释放内存并销毁该对象
delete &player;