在堆?还是栈?

2018-09-25 17:41:45 +08:00
 814084764

C++

class Target{ private: int a; }

class Object { private : Target target; }

Object* obj = new Object;

请问:target 是在堆上?还是栈上??

4389 次点击
所在节点    程序员
30 条回复
bumz
2018-09-25 21:12:47 +08:00
Object 在堆的时候在堆,Object 在栈的时候在栈

习惯了 java 是不是很难受 hhh
zwh2698
2018-09-25 21:25:40 +08:00
Target 改什么都在堆上,内存的分配主要是开对象分配的方式,如果 new 和 placement new 一般在堆,但是后者可以放在栈上,那也是提前你保留了。栈都是编译时候就决定了,大小在这个时候一定可以推导出来,堆是在运行时候分配,大小要看上下文
senxxx
2018-09-25 22:44:15 +08:00
@poorcai 大兄弟。在栈上的话。。如果 obj 指针被作为返回值返回给上一层。。那此时的 target 是个什么情况?
yujincheng08
2018-09-25 22:52:14 +08:00
linshuang
2018-09-26 09:22:30 +08:00
肯对是堆,要是栈,你觉得它能用么。。。
seancheer
2018-09-26 09:50:01 +08:00
堆啊。。

target 占用的内存是属于 new 出来的 obj 的,obj 是你 new 出来的,那么就在堆上。

如果直接 Object obj,那么就是在栈上面。

class Object 的时候,这个属于声明,不会占用内存的。
justou
2018-09-26 10:23:53 +08:00
堆上. 不能在栈上的原因上面提到了. C++也可以 new 在栈上, 叫 placement new, 在某些场景下非常有用

https://www.geeksforgeeks.org/placement-new-operator-cpp/
wizardoz
2018-09-26 12:47:59 +08:00
凡是 new 的都在堆上
cuzfinal
2018-09-26 14:22:16 +08:00
当然是在堆上了,难道 object 里 int a = 1 会在栈上吗?
dychenyi
2018-09-26 16:22:44 +08:00
堆上啊。
反证法:Target target 如果在栈生成,每个类都是由子类和数据类型构成的,那么没有一个类能在堆上了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX