Когда использовать слово «новый», а когда нет в C++?[дубликат]

StackOverflow https://stackoverflow.com/questions/679571

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

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

Point p1 = Point(0,0);

или

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

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

Дубликат:

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

Связанный:

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

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

Это было полезно?

Решение

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

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;
}

(*упреждающие придирки — да, есть расширения, которые позволяют распределять стек переменного размера).

Другие советы

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

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

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
}

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

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

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

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

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top