У меня есть класс, который выглядит так
class A
{
int b;
void B()
{
int c;
}
}
int main()
{
A asdf;
A fdsa = new A();
}
Какая разница между примерами asdf и fdsa класса A? В обоих случаях идет в стек и идет в кучу?
b переменная внутри класса A является глобальной переменной и должна получить пространство в куче независимо от того, как класс был объявлен, правильно?
Кроме того, копия функции B назначается куче и выполняется оттуда?
asdf
переходит в стек, а fdsa
переходит в кучу.
В стандарте C++ нет стека или кучи памяти. Это особенности реализации.
A asdf;
Это автоматический объект, который автоматически выделяет и уничтожает.
A *fdsa = new A();
Это динамический и неавтоматический объект, которым вы должны управлять распределением и уничтожением.
Единственное, что касается стека в стандарте, это "раскручивание стека". :
Процесс вызова деструкторов для автоматических объектов, построенных по пути от блока try до точки, где генерируется исключение, называется "разворачивание стека". [§15.2/3]
Предполагая, что fsda
объявляется как A*
(то есть указатель):
asdf.b
находится в стеке.fsda->b
находится в куче.A::B()
, c
переходит в стек.fdsa->b
не fdsa.b
!
Прежде всего 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
Надеюсь это поможет