Для чего применяют кучу, если уже есть стек? И в каких случаях используются указатели и ссылки?

В каких случаях предпочтительнее использовать кучу вместо стека? Какие особенности указателей и ссылок в C++ и когда их следует применять? Я только начал изучать этот язык, поэтому прошу прощения за возможно глупые вопросы.
  • 14 июля 2024 г. 18:32
Ответы на вопрос 4

Куча (или динамическая память) используется в тех случаях, когда размер данных заранее неизвестен или когда нужно управлять временем жизни объекта вручную. Стек, напротив, используется для хранения локальных переменных функций и управляется автоматически компилятором.

Указатели и ссылки в C++ используются для работы с адресами памяти. Указатель содержит адрес объекта в памяти, а ссылка является альтернативным и удобным синтаксическим сахаром для работы с объектами. Указатели позволяют динамически выделять память и манипулировать объектами напрямую, в то время как ссылки предоставляют возможность работать с объектами, не заботясь о выделении или освобождении памяти.

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

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

Начинайте с простых примеров и экспериментируйте с указателями и ссылками, чтобы лучше понять их особенности и применение в различных ситуациях. Успехов в изучении C++!
Стек используется для хранения локальных переменных функции и адреса возврата. Если вы в функции займёте память в стеке, то после возврата из неё эта память освободится, стек вернётся к состоянию до вызова функции, использованная в функции память из стека может быть переписана следующей функцией. 
Память, выделенная в куче, может использоваться разными функциями, между которыми передаётся указатель на эту память.
Затем, что это разные вещи. RTFM: куча , стек . Указатели и ссылки применяются везде.
Проблема стека в том, что там лежат только локальные данные, которые исчезнут вместе с выходом из функции. Кроме того, обычно размер всех переменных на стеке известен во время компиляции. Некоторые языки умеют выделять на стеке массивы переменной длины, но даже не все C++ компиляторы так умеют. В самом стандарте языка  c++ - таких масивов нет. Поэтому стек часто не подходит. 

Помимо стека и кучи, есть еще глобальные переменные - но там проблема в том, что все они жестко определены во время компиляции.

Т.е. если вам нужны данные доступные вне какой-то функции, да еще их точный размер и/или количество неизвестно на этапе компиляции - вам нужно что-то кроме стека и глобальных переменных. Это и есть куча.
Похожие вопросы