2 回答
TA贡献883条经验 获得超454个赞
就像我在第一段中说的:
Coordinate *p = new Coordinate(); 就是用 new 在堆中构造了一个对象,返回其指针给 p,这样你可以通过 p 使用这个构造出的对象。
而 Coordinate coor; 这样就是很普通的定义了一个对象啊(和 int a 什么的没区别呀),当然一般这个对象是在栈中。
初学时不用太考虑对象是在“堆”中还是在“栈”中,你更应该考虑的是:函数的本地变量(或者说栈中的对象)会随着函数的退出而销毁。而new出来的对象则需要你手动delete(或者说是要求你手动控制其生存期)。
那么如果你只是需要一个变量,就普通的定义一个好了,比如 int a; Coordinate coor; 之类的。
但如果你不确定会使用几个对象,那么你可以用 new 在运行时实例化所需数量的对象。 又或者你需要一个对象在多个函数间传递,或者需要一个对象不随函数退出而销毁(需要后续使用到它),那你就得手动控制其生存期,也就是要new一个,等后续不需要时再delete掉。
总之可能你现在初学没经验,等你用得多了自然就知道什么时候该用 new 了。如果你现在还略搞不清楚,那么也不必钻牛角尖,到时候你就明白了。
另外提一下(你现在看不懂就别管了):手动管理内存在有的情况下可能会很复杂。有时候根本很难搞清一个对象是在哪里 new 出来的,又该由哪个函数负责 delete 掉…… 其实很多内存泄漏问题都是由此引起的。 后面你会学到 C++ 的智能指针,到时候你关注一下,这是很好的东西(总有人说它们不好,其实不然),在 C++ 中你该学会活用智能指针。
TA贡献883条经验 获得超454个赞
一般说“分配内存”都是指在堆中分配。看你在 C 和 C++ 区中都问了这个问题,在 C 语言中,用 malloc 之类的库函数所分配的内存就在堆中。C++ 中用 new 创建的对象也在堆中,当然也可以使用从 C 中继承而来的 std::malloc 之类的。
函数中所有的本地变量,都是在栈中的。所以在栈中创建对象、分配内存并不需要特殊的语法,你一般使用的变量都是在栈中。也就是说一般没有“在栈中分配内存”这样的说法。
以上是最通常的用法。不过呢,C++ 中还有一类被称为 placement new 的 new 用法,它可以在你指定的内存处构造对象,所以如果你向其传入栈中的地址,是可以在栈中构造对象的。即便是这样,我觉得这也应该叫作“在栈中构造对象”而非“在栈中分配内存”。 而且绝大多数情况下无需这样做。
- 2 回答
- 1 关注
- 1679 浏览
添加回答
举报