如果一个类实例声明为A a,那么它将位于内存中?

时间:2011-10-27 00:14:38

标签: c++ c class object

如果声明A类的实例: “一个;” 它将在哪种内存类型上创建? 任何其他类型的内存类型?

我的解决方案:

取决于声明的位置。 如果它是一个全局变量,并且在任何类和函数之外,它就在堆上。 如果它在类或函数中,则它在堆栈中。 如果在命名空间中,它就在堆上。

正确?

2 个答案:

答案 0 :(得分:3)

您的问题假设只有两个答案是“堆叠”和“堆积”。

在函数或类/ union之外声明的所有变量都存在于全局内存中。这就是为什么它们通常被称为“全局”。该内存是通过加载可执行文件创建的,并且在main执行之前调用这些类的构造函数(并且在main之后调用析构函数)。

如果在函数内部声明一个变量,那么它就在堆栈中。进入“堆”的唯一方法是使用new显式分配它,或者它是自己分配的其他对象的成员。

类/联盟的成员生活在声明变量的任何地方。

答案 1 :(得分:2)

如果它是函数的本地函数,它就在堆栈中。如果它是全局的或静态的,则它位于可执行文件的数据段(AAKA“全局内存”)中。如果它是另一个类中的声明,则可以是任何位置,具体取决于如何分配类的实例。

命名空间不会影响任何内容。它只适用于编译器。

编辑:课程。

如果一个实例被声明为A a;,并且这个声明恰好在一个类中,如下所示:

class B
{
    A a;
};

然后a的内存位置由分配B的封闭实例的方式决定。例如,在B b;的情况下,适用相同的规则 - 堆栈或全局内存。如果是

B * b =新B();

然而,

然后你的AB的其他人一起生活在堆上。