如果声明A类的实例: “一个;” 它将在哪种内存类型上创建? 任何其他类型的内存类型?
我的解决方案:
取决于声明的位置。 如果它是一个全局变量,并且在任何类和函数之外,它就在堆上。 如果它在类或函数中,则它在堆栈中。 如果在命名空间中,它就在堆上。
正确?
答案 0 :(得分:3)
您的问题假设只有两个答案是“堆叠”和“堆积”。
在函数或类/ union之外声明的所有变量都存在于全局内存中。这就是为什么它们通常被称为“全局”。该内存是通过加载可执行文件创建的,并且在main
执行之前调用这些类的构造函数(并且在main
之后调用析构函数)。
如果在函数内部声明一个变量,那么它就在堆栈中。进入“堆”的唯一方法是使用new
显式分配它,或者它是自己分配的其他对象的成员。
类/联盟的成员生活在声明变量的任何地方。
答案 1 :(得分:2)
如果它是函数的本地函数,它就在堆栈中。如果它是全局的或静态的,则它位于可执行文件的数据段(AAKA“全局内存”)中。如果它是另一个类中的声明,则可以是任何位置,具体取决于如何分配类的实例。
命名空间不会影响任何内容。它只适用于编译器。
编辑:课程。
如果一个实例被声明为A a;
,并且这个声明恰好在一个类中,如下所示:
class B
{
A a;
};
然后a
的内存位置由分配B
的封闭实例的方式决定。例如,在B b;
的情况下,适用相同的规则 - 堆栈或全局内存。如果是
B * b =新B();
然而,然后你的A
和B
的其他人一起生活在堆上。