Понимание базового примера динамического размещения

У меня есть очень базовый довод в отношении динамического распределения. Изучая дерево, следуя возможным синтаксисам, я сказал, что все они являются динамическими распределениями.

Первый:

int* px(nullptr);
px = new int;
*px =20;

Тогда более краткий:

int* px(nullptr);
px = new int(20);

Или даже:

int*px(new int(20));

Затем во второй момент в том же объяснении мне сказали, что третий случай на самом деле является статическим распределением. Чем я запутался.

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

Большое спасибо.

0

Решение

Ваш первый пример:

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.

2

Другие решения

Во всех примерах у вас есть комбинация статического и динамического распределения и двух переменных, которые находятся в автоматической и динамической памяти соответственно.

Педантично, указатель px является автоматической переменной, и на что она указывает (*px) является динамически распределенной переменной.

px уничтожается, когда автоматически выходит из области видимости, *px должен быть очищен явно (через delete px;)

2

По вопросам рекламы [email protected]