У меня есть очень базовый довод в отношении динамического распределения. Изучая дерево, следуя возможным синтаксисам, я сказал, что все они являются динамическими распределениями.
Первый:
int* px(nullptr);
px = new int;
*px =20;
Тогда более краткий:
int* px(nullptr);
px = new int(20);
Или даже:
int*px(new int(20));
Затем во второй момент в том же объяснении мне сказали, что третий случай на самом деле является статическим распределением. Чем я запутался.
Это правда? Может кто-нибудь объяснить мне, почему, пожалуйста?
Большое спасибо.
Ваш первый пример:
int* px(nullptr);
px = new int;
*px =20;
Первая строка создает выделенный в стеке указатель и присваивает ему значение «nullptr». Вторая строка создает целое число, выделенное в куче, и назначает px указатель на это целое число. Последняя строка разыменовывает px и присваивает 20 значению кучи.
В вашем втором примере:
int* px(nullptr);
px = new int(20);
Вторая строка создает int, размещенный в куче со значением 20, и назначает его указатель на px.
В вашем последнем примере:
int*px(new int(20));
Вы создаете целое число, выделенное для кучи, со значением 20, и его указатель передается обратно в качестве аргумента для инициализации целочисленного указателя px. Это так же, как:
int* px = new int(20);
Поэтому, чтобы ответить на ваш вопрос, только строки, которые содержат «new», являются динамическим распределением памяти.
new = heap selected, в противном случае это стек, если вы не вызываете функцию / оператор, который использует new или malloc.
Во всех примерах у вас есть комбинация статического и динамического распределения и двух переменных, которые находятся в автоматической и динамической памяти соответственно.
Педантично, указатель px
является автоматической переменной, и на что она указывает (*px
) является динамически распределенной переменной.
px
уничтожается, когда автоматически выходит из области видимости, *px
должен быть очищен явно (через delete px;
)