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

0

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

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

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

а также

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

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

  • 0
    Для вашего второго куска кода это должно быть Movie* firstMovie = new Movie("Titanic", 126, 13.2); Скомпилировать.
  • 0
    Спасибо, я отредактирую это изменение.
Показать ещё 1 комментарий
Теги:
object
oop
initialization

5 ответов

1
Лучший ответ

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

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

Путаница исходит от Гослинга, странного настаивания на том, чтобы использовать new для обозначения "сделать меня объектом". Документация по Java всегда хвастается тем, что вам не нужно delete вещи, которые вы new -ed вверх (из-за сборщика мусора), но никогда не упоминает, что в 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, и это означает, что вам нужно иметь конструктор копирования.

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

Итак, если вам нужно использовать только объект внутри функции, тогда объект лучше всего создается в стеке, поэтому вам не нужно беспокоиться о утечке памяти.

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

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

  • 2
    When you exit the function where the object was created the objects on the heap will be destroyed and any reference to this object will become invalid это не произошло с переменными стека?
  • 0
    @uncletall: компилятор оптимизирован уже несколько дней, поэтому в этом случае конструктор копирования не получит вызов.
Показать ещё 2 комментария
1

Память будет распределена для обоих:

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

а также

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

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

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;

0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню