假设我有一个简单的Movie对象,它只跟踪一些名称,长度和成本的数据成员。
如果在我的驱动程序文件中,我创建了一个Movie对象。哪个是首选和不同之处:
Movie firstMovie = Movie("Titanic", 126, 13.2);
和
Movie* firstMovie = new Movie("Titanic", 126, 13.2);
我认为后者是如果我们需要访问该对象,如果它所在的方法要执行。换句话说,如果创建的第一个对象像方法中那样初始化,那么一旦方法执行完毕,我们就会失去任何连接,因为没有为它分配内存。我的思维方式是否正确?这不是家庭作业,更多的是自从我从Java过渡以来潜伏的问题。谢谢。
答案 0 :(得分:2)
首先,你应该写:
Movie firstMove("Titanic", 126, 13.2); // Created on the stack
Movie *pFirstMovie = new Movie("Titanic", 126, 13.2); // Created on the heap
否则,您创建一个对象,然后将其复制到firstMovie,这意味着您需要一个复制构造函数。
主要区别在于第一个示例在堆栈上创建一个对象,第二个示例在堆上创建它。退出创建对象的函数时,堆栈上的对象将被销毁,对该对象的任何引用都将失效。
因此,如果您只需要在函数中使用该对象,那么最好在堆栈上创建对象,这样您就不必担心内存泄漏。
但是,如果要在其他位置使用该对象,最好使用new运算符在堆上创建它。您可以自由地传递引用,但需要记住以后删除它。
在堆上创建对象的另一个好处是,当您需要大量数据或进行递归时,堆栈空间的运行速度远远快于堆空间用完。
答案 1 :(得分:1)
将为两者分配内存:
Movie firstMovie("Titanic", 126, 13.2);
和
Movie* firstMovie = new Movie("Titanic", 126, 13.2);
不同之处在于,一旦它超出范围,第一个将被破坏,第二个将保持相同,直到您单独删除。第二种方法称为动态内存分配,内存将在heap
中分配,其中第一种情况将在stack
中分配内存。
答案 2 :(得分:1)
我想你明白了两者之间的区别。相反,问题是“我应该选择哪个?”就个人而言,如果我可以逃脱它,我宁愿把东西放在堆栈上。现在你的堆栈足够大,你不会得到堆栈溢出,除非你有一些其他bug,把东西放在堆栈意味着(1)没有必要手动delete
,(2)它更多可能是在内存缓存中而不是堆上的内容,以及(3)分配内存的速度与您可以获得的速度一样快。
然而,有时候你无法逃脱它。在这些情况下,请继续把事情放在堆上。
戈斯林奇怪地坚持使用new
来表示“让我成为一个对象”。 Java文档总是吹嘘你不需要delete
你需要new
的东西(因为垃圾收集器),但似乎没有提到在C ++中你不需要{ {1}}几乎和Java一样频繁。
答案 3 :(得分:0)
您可以像这样简单地实例化对象:
Movie firstMovie ("Titanic", 126, 13.2);
初始化原始指针时必须使用new关键字。
Movie *firstMovie = new Movie("Titanic", 126, 13.2);
不同之处在于,当访问成员函数时,指针对象使用->
,而另一个对象使用.
表示法。指针对象也在堆中分配,而另一个在堆栈中分配。
答案 4 :(得分:0)
Movie firstMovie = Movie("Titanic", 126, 13.2);
您正在通过调用构造函数创建一个对象,该元素将被分配给firstMovie
。
更好的方法是
Movie firstMovie("Titanic", 126, 13.2);
在第二种情况下
Movie* firstMovie = new Movie("Titanic", 126, 13.2);
您正在动态创建堆上的对象,一旦不再需要,就需要使用delete
删除此对象。
delete firstMovie;