Вопрос:

Создание объектов C ++ и распределение памяти

c++ oop object initialization

105 просмотра

5 ответа

0 Репутация автора

Допустим, у меня есть простой объект Movie, который просто отслеживает несколько элементов данных имени, длины и стоимости.

Если в моем файле драйвера я создаю объект Movie. Что является предпочтительным и разница:

Movie firstMovie = Movie("Titanic", 126, 13.2);

а также

Movie* firstMovie = new Movie("Titanic", 126, 13.2);

Я думаю, что последнее - это если бы у нас была необходимость доступа к этому объекту, если бы выполнялся метод, в котором он находился. Другими словами, если первый созданный объект был инициализирован так же, как в методе, то после завершения выполнения метода мы потеряем любое соединение, так как для него не было выделено памяти. Правильно ли мое мышление? Это не домашняя работа, больше вопрос, который скрывался с момента моего перехода с Java. Спасибо.

Автор: user3159071 Источник Размещён: 28.02.2014 05:44

Ответы (5)


2 плюса

4889 Репутация автора

Во-первых, вы должны написать:

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:52

0 плюса

428 Репутация автора

Вы можете просто создать экземпляр объекта следующим образом:

Movie firstMovie ("Titanic", 126, 13.2);

Вы должны использовать новое ключевое слово при инициализации сырых указателей.

Movie *firstMovie = new Movie("Titanic", 126, 13.2);

Разница в том, что объект указатель использует ->при доступе к функциям-членам, в то время как другой объект использует .обозначения. Также указатель объекта размещается в куче, в то время как другой размещается в стеке.

Автор: Kenneth Bastian Размещён: 28.02.2014 05:53

0 плюса

1635 Репутация автора

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;

Автор: HadeS Размещён: 28.02.2014 05:54

1 плюс

877 Репутация автора

Память будет выделена для обоих:

Movie firstMovie("Titanic", 126, 13.2);

а также

Movie* firstMovie = new Movie("Titanic", 126, 13.2);

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

Автор: rajenpandit Размещён: 28.02.2014 05:58

1 плюс

17415 Репутация автора

Решение

Я думаю, что вы понимаете разницу между двумя в порядке. Вместо этого возникает вопрос "что мне лучше выбрать?" Лично, если мне это удастся, я предпочитаю ставить вещи в стек. В настоящее время ваш стек достаточно велик, так что вы не получите переполнение стека, если у вас нет какой-либо другой ошибки, и размещение вещей в стеке означает (1) нет необходимости deleteвручную, (2) более вероятно, что он будет в кэш памяти, чем вещи в куче, и (3) выделение памяти происходит так быстро, как вы можете получить.

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

Путаница происходит из-за странной настойчивости Гослинга в использовании newвыражения «сделай меня объектом». Документация Java всегда хвастается тем, что вам не нужны deleteвещи, которые вы newсобрали (из-за сборщика мусора), но, кажется, никогда не упоминается, что в C ++ вам не приходится сталкиваться с newтакими же проблемами, как в Java.

Автор: Max Lybbert Размещён: 28.02.2014 06:21
Вопросы из категории :
32x32