Создание объектов C ++ и распределение памяти
105 просмотра
5 ответа
Допустим, у меня есть простой объект Movie, который просто отслеживает несколько элементов данных имени, длины и стоимости.
Если в моем файле драйвера я создаю объект Movie. Что является предпочтительным и разница:
Movie firstMovie = Movie("Titanic", 126, 13.2);
а также
Movie* firstMovie = new Movie("Titanic", 126, 13.2);
Я думаю, что последнее - это если бы у нас была необходимость доступа к этому объекту, если бы выполнялся метод, в котором он находился. Другими словами, если первый созданный объект был инициализирован так же, как в методе, то после завершения выполнения метода мы потеряем любое соединение, так как для него не было выделено памяти. Правильно ли мое мышление? Это не домашняя работа, больше вопрос, который скрывался с момента моего перехода с Java. Спасибо.
Источник Размещён: 13.11.2019 11:33Ответы (5)
1 плюс
Я думаю, что вы понимаете разницу между двумя в порядке. Вместо этого возникает вопрос "что мне лучше выбрать?" Лично, если мне это удастся, я предпочитаю ставить вещи в стек. В настоящее время ваш стек достаточно велик, так что вы не получите переполнение стека, если у вас нет какой-либо другой ошибки, и размещение вещей в стеке означает (1) нет необходимости delete
вручную, (2) более вероятно, что он будет в кэш памяти, чем вещи в куче, и (3) выделение памяти происходит так быстро, как вы можете получить.
Однако бывают случаи, когда вы не можете сойти с рук. В этих случаях, идти вперед и положить вещи в кучу.
Путаница происходит из-за странной настойчивости Гослинга в использовании new
выражения «сделай меня объектом». Документация Java всегда хвастается тем, что вам не нужны delete
вещи, которые вы new
собрали (из-за сборщика мусора), но, кажется, никогда не упоминается, что в C ++ вам не приходится сталкиваться с new
такими же проблемами, как в Java.
2 плюса
Во-первых, вы должны написать:
Movie firstMove("Titanic", 126, 13.2); // Created on the stack
Movie *pFirstMovie = new Movie("Titanic", 126, 13.2); // Created on the heap
В противном случае вы создаете объект, а затем копируете его в firstMovie, а это значит, что вам нужен конструктор копирования.
Основное отличие состоит в том, что первый пример создает объект в стеке, а второй - в куче. При выходе из функции, в которой был создан объект, объекты в стеке будут уничтожены, и любая ссылка на этот объект станет недействительной.
Таким образом, если вам нужно только использовать объект внутри функции, тогда этот объект лучше всего создавать в стеке, так что вам не нужно беспокоиться об утечках памяти.
Однако, если вы хотите использовать объект в других местах, лучше всего создать его в куче, используя оператор new. Вы можете свободно передавать ссылки, но не забудьте удалить их позже.
Еще одним преимуществом создания объекта в куче является то, что когда вам требуется много данных или есть рекурсия, вы будете использовать пространство стека намного быстрее, чем то, которое у вас заканчивается пространство кучи.
Автор: uncletall Размещён: 28.02.2014 05:521 плюс
Память будет выделена для обоих:
Movie firstMovie("Titanic", 126, 13.2);
а также
Movie* firstMovie = new Movie("Titanic", 126, 13.2);
разница в том, что первый будет уничтожен, как только выйдет из области видимости, где второй останется таким же, пока вы не удалите отдельно. Второй метод называется динамическим распределением памяти, и память будет выделяться heap
там, где для первого случая будет выделяться память stack
.
0 плюса
Вы можете просто создать экземпляр объекта следующим образом:
Movie firstMovie ("Titanic", 126, 13.2);
Вы должны использовать новое ключевое слово при инициализации сырых указателей.
Movie *firstMovie = new Movie("Titanic", 126, 13.2);
Разница в том, что объект указатель использует ->
при доступе к функциям-членам, в то время как другой объект использует .
обозначения. Также указатель объекта размещается в куче, в то время как другой размещается в стеке.
0 плюса
Movie firstMovie = Movie("Titanic", 126, 13.2);
Вы создаете объект, вызывая конструктор, которому присваивается inturn firstMovie
. Лучший способ сделать это будет
Movie firstMovie("Titanic", 126, 13.2);
Во втором случае
Movie* firstMovie = new Movie("Titanic", 126, 13.2);
Вы динамически создаете объект в куче, вам нужно удалить этот объект, как delete
только он больше не требуется.
delete firstMovie;
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- oop Передать по ссылке или передать по значению?
- oop Что такое инверсия контроля?
- oop Предпочитаете композицию наследству?
- oop Когда вы должны использовать класс против структуры в C ++?
- object Вызов функции модуля с использованием его имени (строки)
- object Создайте базовый итератор Python
- object Обнаружение неопределенного свойства объекта
- object Каков наиболее эффективный способ глубокого клонирования объекта в JavaScript?
- object Как определить равенство для двух объектов JavaScript?
- initialization Are delphi variables initialized with a value by default?
- initialization How to initialize private static members in C++?
- initialization Как инициализировать все элементы массива одним и тем же значением?
- initialization Почему мы не можем инициализировать элементы внутри структуры?
- initialization Python - создать список с начальной емкостью