Это показывает, что вам нужно серьезно начать изучать C ++ из книги. Ответ на этот вопрос будет очень долгим, поскольку эти два понятия очень разные.
Короче говоря, вот несколько подсказок для вас:
Trie* trie = new Trie();
Распределяет память в куче, вы получаете указатель на выделенную память, и вам нужно delete
, когда вы закончите с ней.
Trie trie;
Выделяет trie
в стеке, и объект уничтожается, как только заканчивается его область действия.
Первый используется, если вам нужен объект, чтобы жить через разные области, и второй, если объект нужен только в определенной области.
Первый имеет стоимость времени выполнения, а второй - нет (или очень очень мало).
С первым вы можете выделить всю необходимую вам память (столько памяти, сколько у вас есть), в то время как со вторым вы связаны размером стека.
Редактировать: Ответ на ваш первый комментарий
Стек выделяется операционной системой при загрузке программы. Компилятор не принимает какого-либо определенного размера для стека и, действительно, при каждом вызове функции или вообще при вводе новой области видимости просто идет и записывает дальше в стек. Если у вас есть рекурсивные функции, которые идут слишком глубоко, вы действительно получите ошибку ошибки сегментации (нарушение доступа).
С другой стороны, куча - это весь пул памяти, который имел компьютер, и управляла операционной системой. Вызов new
запрашивает памяти из операционной системы. Если памяти недостаточно, операционная система может отклонить запрос, и вы получите NULL
(Примечание: после каждого new
вы должны проверять, равен ли результат NULL
или нет. Если это NULL
, вы должны обработать этот неудачный случай. В противном случае ваша программа потерпит крах). Точно так же, когда вам больше не нужна память, вы должны delete
. Также обратите внимание, что delete
вызывает деструктор вашего объекта и, таким образом, на самом деле имеет решающее значение для нормальной программы.