Когда использовать «новое», а когда нет, в C ++?

Возможный дубликат:
Когда следует использовать новое ключевое слово в C ++?

Когда следует использовать «новый» оператор в C ++? Я прихожу с фона C # / Java, а объекты-объекты для меня запутывают.

Если я создал простой class под названием «Точка», когда я создаю точку, я должен:

Point p1 = Point(0,0); 

или

 Point* p1 = new Point(0, 0); 

Может ли кто-нибудь уточнить для меня, когда использовать нового оператора, а когда нет?

Дубликат:

Когда следует использовать новое ключевое слово в C ++?

Связанный:

О конструкторах / деструкторах и новых / удаленных операциях в C ++ для пользовательских объектов

Правильное использование стека и кучи в C ++?

Вы должны использовать new если хотите, чтобы объект оставался на месте до его delete . Если вы не используете new тогда объект будет уничтожен, когда он выходит за frameworks. Вот некоторые примеры:

 void foo() { Point p = Point(0,0); } // p is now destroyed. for (...) { Point p = Point(0,0); } // p is destroyed after each loop 

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

В приведенном ниже примере расположение «p» будет там, где выделяется его содержащий объект Foo. Я предпочитаю называть это распределение «на месте».

 class Foo { Point p; }; // p will be automatically destroyed when foo is. 

Выделение (и освобождение) объектов с использованием new намного дороже, чем если они выделены на месте, поэтому его использование должно быть ограничено там, где это необходимо.

Второй пример того, когда выделять через new – для массивов. Вы не можете * изменять размер массива на месте или стека во время выполнения, поэтому, когда вам нужен массив неопределенного размера, он должен быть назначен через new.

Например

 void foo(int size) { Point* pointArray = new Point[size]; ... delete [] pointArray; } 

(* pre-emptive nitpicking – да, есть расширения, которые позволяют распределять стеки по размеру).

Взгляните на этот вопрос и этот вопрос на некоторые хорошие ответы на экземпляр объекта C ++.

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

 void SomeFunc() { Point p1 = Point(0,0); } // p1 is automatically freed void SomeFunc2() { Point *p1 = new Point(0,0); delete p1; // p1 is leaked unless it gets deleted } 

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

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

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

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

 Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function. Point* p2 = new Point(0, 0); //This must be freed manually. with... delete p2; 
  • Что означает new ()?
  • В чем разница между созданием экземпляра объекта с использованием нового vs.
  • Можно ли удалить не новый объект?
  • «Новое» ключевое слово в Scala
  • Печать в новой строке, java
  • Когда следует использовать новое ключевое слово в C ++?
  • Как delete знает, что это массив?
  • Есть ли гарантия выравнивания возврата адреса с помощью новой операции C ++?
  • Какое использование используется для «размещения нового»?
  • Как я должен писать стандартные стандартные и удаленные операторы ISO C ++ Standard?
  • Создание объекта: с или без `new`
  • Interesting Posts

    Bash – как вы делаете это так, чтобы результат команды попадал в переменную?

    nvm продолжает «забывать» узел в новом сеансе терминала

    Разрешение MSB3247 – обнаружены конфликты между различными версиями одной и той же зависимой сборки

    Что такое mapDispatchToProps?

    MongoDB и «объединяется»

    Невозможно создать логический диск, все диски являются динамическими

    maven-dependency-plugin (цели «копии-зависимости», «распаковка») не поддерживается m2e

    Если временные данные неявно не модифицируются, как это работает?

    Загрузка jQuery страниц WordPress через ajax

    Почему решающий m4 SATA SSD, подключенный к док-станции Inateck USB 3.0, значительно меньше ожидаемого ~ 410 МБ / с?

    Установка Windows XP не распознает жесткий диск нетбука

    Есть ли способ подсчета с помощью макросов?

    Как использовать .jar-файлы в NetBeans?

    Использовать Task.Run () в синхронном методе, чтобы избежать тупиковой остановки в асинхронном методе?

    Потоковое аудио с URL-адреса в Android с помощью MediaPlayer?

    Давайте будем гением компьютера.