int i = 3;
это создает в стеке объект типа int
. (В стандарте C ++ используется термин «автоматическое c хранилище», и я обычно сторонник правильного использования формальных терминов, но «стек» и «куча» глубоко встроены в словарь программирования, поэтому «стек» и « куча "просто хороши как технические термины).
int *ip = 0;
это создает объект типа int*
в стеке. ip
содержит нулевой указатель.
int *ip = new int;
это создает в стеке объект типа int*
, как и предыдущий. Он содержит указатель на память в куче (см. Ранее круглые скобки; формальный термин - «свободное хранилище»). Вы знаете, что память находится в куче, потому что это то, что делает operator new
.
Когда вы закончите с памятью кучи, вы должны освободить ее:
delete ip;
если вы не Если не удалить его, а функция, которая его создала, вернет, локальная переменная (ip
), которая содержала указатель, исчезла. Память была выделена и не была освобождена, поэтому, если вы не скопировали указатель в какое-то другое место, у вас не будет возможности получить выделенную память. Это называется «утечкой памяти».