说我有这样的课程:
class Test
{
int x;
SomeClass s;
}
我实例化它:
Test* t = new Test;
堆栈上的x还是堆?那怎么样?
答案 0 :(得分:19)
Test a;
Test *t = new Test;
a及其所有成员都在堆栈中。
t指向的对象及其所有成员都在堆上。
指针t在堆栈上。
答案 1 :(得分:10)
每次使用new(我们在这里讲C ++)“实例化”一个对象/符号时,将为该对象分配一个新的内存区域。如果没有,它将被放在“本地”记忆区。
问题是我没有“本地”内存区域的标准定义。
这意味着,例如:
struct A
{
A()
{
c = new C() ;
}
B b ;
C * c ;
}
void doSomething()
{
A aa00 ;
A * aa01 = new A() ;
}
对象aa00在堆栈上分配。
当根据aa00在“本地”内存上分配aa00 :: b时,aa00 :: b被分配在由新aa01指令分配的内存范围内。因此,aa00 :: b也在堆栈上分配。
但是aa00 :: c是一个指针,用new分配,因此aa00 :: c设计的对象在堆上。
现在,这是一个棘手的例子:aa01是通过一个新的分配的,因此在堆上。
在这种情况下,当根据aa01在“本地”内存上分配aa01 :: b时,在新aa01指令分配的内存范围内分配aa00 :: b。因此,aa00 :: b在堆上,“内部”已经分配给aa01的内存。
由于aa01 :: c是一个用new分配的指针,因此aa01 :: c设计的对象位于堆上,而不是为aa01分配的内存范围。
所以,游戏的重点是:
1 - 研究对象的“本地”记忆是什么:堆栈堆?
2 - 如果对象是通过new分配的,那么它在本地内存之外,即它在堆上的其他位置
3 - 如果对象被分配为“没有新”,则它位于本地存储器内
4 - 如果“本地”内存在堆栈上,那么没有new的对象也在堆栈中
5 - 如果“本地”内存在堆上,那么没有new的对象也在堆上,但仍在本地内存中。
抱歉,我没有更好的词汇来表达这些概念。
答案 2 :(得分:6)
由于你已经使用了new
,所以它都在堆上,在[{1}}的内存区域中[或多或少]连续存储。
答案 3 :(得分:5)
t在堆栈上。 * t处的对象在堆上。它在一个单元中包含一个int和一个SomeClass对象。
答案 4 :(得分:1)
由于您使用的是new,因此您需要在堆上分配对象。因此,t指向的每个测试成员也都在堆上。
答案 5 :(得分:1)
class MyClass {
int i;
MyInnerClass m;
MyInnerClass *p = new MyInnerClass();
}
MyClass a;
MyClass *b = new MyClass();
a在堆栈上;它的成员a.i和a.m(包括a.m的任何成员)和a.p(指针,而不是它指向的对象)是它的一部分,也是堆栈的一部分。
a.p指向的对象在堆上。
b指向的对象在堆上,包括其所有成员; b.p。
指向的对象也是如此