ООП и куча / стек

0

У меня есть класс, который выглядит так

class A
{
    int b;

    void B()
    {
        int c;
    } 
}


int main()
{
    A asdf;

    A fdsa = new A();
}

Какая разница между примерами asdf и fdsa класса A? В обоих случаях идет в стек и идет в кучу?

b переменная внутри класса A является глобальной переменной и должна получить пространство в куче независимо от того, как класс был объявлен, правильно?

Кроме того, копия функции B назначается куче и выполняется оттуда?

  • 0
    Вы уверены, что ваш код компилируется в C ++? Я верю, что не будет.
  • 0
    Это написано на K ++
Показать ещё 10 комментариев
Теги:
oop

4 ответа

2
Лучший ответ

asdf переходит в стек, а fdsa переходит в кучу.

  • 0
    Кроме того, я думаю, что fdsa должен быть указателем, потому что он должен указывать на экземпляр класса A.
1

В стандарте C++ нет стека или кучи памяти. Это особенности реализации.

A asdf;

Это автоматический объект, который автоматически выделяет и уничтожает.

A *fdsa = new A();

Это динамический и неавтоматический объект, которым вы должны управлять распределением и уничтожением.


Единственное, что касается стека в стандарте, это "раскручивание стека". :

Процесс вызова деструкторов для автоматических объектов, построенных по пути от блока try до точки, где генерируется исключение, называется "разворачивание стека". [§15.2/3]

1

Предполагая, что fsda объявляется как A* (то есть указатель):

  • asdf.b находится в стеке.
  • fsda->b находится в куче.
  • Всякий раз, когда вы вызываете A::B(), c переходит в стек.
  • 0
    И это должно быть fdsa->b не fdsa.b !
  • 0
    @BasileStarynkevitch: исправлено.
1

Прежде всего fdsa должен быть указателем.

A a_on_stack; // Destroys when going out of scope
A* a_on_heap = new A(); // Need to call "delete a_on_head;" to remove from memory

Надеюсь это поможет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню