如果通过new创建对象,成员函数的局部变量在哪里创建?

Where is local variable of member function created if object is created via new?

Class A
{
    int a;
    int get_a()
    {
       int d;
       return a;
    }
};

A* obj_a_ptr = new A;
int c = A->get_a();

int d 内存分配在哪里,是在堆中还是在堆栈中?

成员函数与自由函数没有太大区别,它们只是隐含地获得一个 this 指针作为第一个参数。所以你的成员函数或多或少等同于(让我们忘记你的 A 中没有任何东西实际上是可访问的,因为它都是 private

int get_a(A* obj)
{
   int d;
   return obj->a;
}

我希望这已经回答了您的问题。 obj 是否通过 new 分配对 d 是否在堆栈上没有影响。

创建对象时,会为其非静态数据成员分配内存。成员函数不包括在对象占用的内存中,但它可以包含指向虚函数指针table的指针。

所以在函数get_a中局部变量d有自动存储期限。退出函数后,对象的成员函数不需要的任何其他函数都可以使用内存。

考虑以下演示程序

#include <iostream>

struct A
{
    explicit A( int x = 0 ) : x( x ) {}
    int x;
    static int a[];
    int get() const { return x; }
    void set( int x ) { A::x = x; } 
};

int A::a[100];

int main()
{
    std::cout << "sizeof( A ) = " << sizeof( A ) << '\n';
}

它的输出是

sizeof( A ) = 4

所以在这个演示程序中class的一个对象的大小恰好等于它的数据成员x的大小(一般来说class可以用获得对齐的额外字节)。

对象的[非静态]数据成员被视为子对象,并作为该对象的一部分存储。所以如果封装对象是"on the heap",那么你的成员就是"on the heap"。 (如果不是, 会存储什么?)

但是,这不会影响在成员函数内声明的局部变量。不需要将它们与对象一起存储。事实上,这在运行时很难做到。

需要注意的是,C++ 规范实际上并没有为局部变量规定任何特定的存储区域,只是规定了它们的生命周期和作用域。但编译器通常使用堆栈,因为这会在函数范围结束时带来一些更简单的处理。因此 所有 局部变量都在堆栈上。

在您的示例中,变量 c obj_a_ptr 的存储将在堆栈上。

请注意,obj_a_ptr 的存储也在堆栈上,这是存储变量值的地方。对于指针,变量本身在堆栈上(对于局部变量),但它可能指向任何合适的对象(在堆上或全局或其他任何地方)。