amine zawix Ответов: 2

Динамическое распределение C++


Допустим, у нас есть класс а
class A 
{
// blabla
public int x;
}


когда мы это сделаем:
A a=new A();

х также выделяется динамически?
Объяснение будет отличным. Спасибо

Что я уже пробовал:

Я думаю, что это делается динамически, так как нам нужно перейти к объекту, чтобы получить доступ к "x".

2 Ответов

Рейтинг:
15

Jochen Arndt

В выделенном блоке памяти хранятся только нестатические переменные-члены. В вашем примере память хранит только то, что x член и имеет поэтому по крайней мере размер int.

Вы можете проверить это, распечатав адреса:

class A
{
public:
    A() { x = 0; }
    int x;
};

int main()
{
    A *a = new A();
    printf("Size of A = %lu\n", sizeof(*a));
    printf("Address of a = %p\n", a);
    printf("Address of a->x = %p\n", &a->x);
    return 0;
}
что может напечатать
Size of A = 4
Address of a = 0x602010
Address of a->x = 0x602010

Обратите внимание также на правильный синтаксис, используемый в моем примере (определение класса должно заканчиваться точкой с запятой и a это указатель).


amine zawix

Спасибо

Рейтинг:
12

Leo Chapiro

Вы можете создать объект в стеке или динамически в куче.
В стеке:

void myFunc()
{
   A a;
}


Теперь существует "а" до тех пор, пока вы выполняете myFunc.

Динамически в куче:

A* heapA = new A();


Теперь у вас есть указатель на A, и Вы можете использовать его столько, сколько вам нужно.
После этого вам нужно уничтожить его, чтобы освободить память:
delete heapA;


Надеюсь, это ответ на ваш вопрос. Для получения более подробной информации взгляните на Стратегии выделения памяти - ModernesCpp.com[^]


amine zawix

Спасибо