当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《数据成员是否与C++中的对象分配在相同的内存空间中?》经验,为你挑选了4个好方法。

说我有一个这样的课:

class Test
{
  int x;
  SomeClass s;
}

我像这样实例化它:

Test* t = new Test;

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



1> moonshadow..:
Test a;
Test *t = new Test;

a及其所有成员都在堆栈中.

t指向的对象及其所有成员都在堆上.

指针t在堆栈上.



2> paercebal..:

每次使用new(我们在这里讲C++)"实例化"一个对象/符号时,将为该对象分配一个新的内存区域.如果没有,它将被放在"本地"内存区域.

问题是我没有"本地"内存区域的标准定义.

一个例子

这意味着,例如:

struct A
{
   A()
   {
      c = new C() ;
   }

   B b ;
   C * c ;
}

void doSomething()
{
   A aa00 ;
   A * aa01 = new A() ;
}

对象aa00分配在堆栈上.

由于aa00 :: b根据aa00分配在"本地"内存中,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的对象也在堆上,但仍在本地内存中.

对不起,我没有更好的词汇来表达这些概念.



3> Avdi..:

自从你使用之后new,它就全部在堆上,或多或少地连续t存储在内存区域中.



4> James Curran..:

t在堆栈上.*t处的对象在堆上.它在一个单元中包含一个int和一个SomeClass对象.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有