数据成员是否与C ++中的对象分配在相同的内存空间中?

时间:2008-10-09 15:25:06

标签: c++ memory-management

说我有这样的课程:

class Test
{
  int x;
  SomeClass s;
}

我实例化它:

Test* t = new Test;

堆栈上的x还是堆?那怎么样?

6 个答案:

答案 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。

指向的对象也是如此