Money a(3,15);
Выделяет объект Money
в локальной области.
Money* b=new Money(3,15);
Распределяет указатель-переменную в локальной области и делает указатель «точкой» для Money
объекта, который находится в свободном хранилище (при условии, что выделение завершено успешно, в противном случае std::bad_alloc()
генерируется)
Пример 1:
Допустим следующий сценарий:
Money * b = initialize();
, где
Money* initialize()
{
Money x(2 , 15);
return &x;
}
Это не удастся, потому что после того, как initialize()
достигнет конца выполнения, x
будет уничтожено, а теперь b
указывает на местоположение, которое недопустимо для использования, и вызывает Undefined Behavior, если вы его использовали. так что вместо этого вы должны выделить его указателем
Money* initialize()
{
return new Money(2,15);
}
Бесплатный магазин также используется, когда вы хотите хранить и использовать массивы большого размера.
Существует разница между ними, как вы заметили в примере, и в том, что в локальной области действия x
вам не нужно delete
объект. Но при использовании new
вам придется вручную сделать delete x;
. В противном случае происходит утечка памяти (пространство памяти занято, и никогда больше не будет использоваться, следовательно, память используется).
См. Ответ Мартина Йорка для более глубоких знаний, помимо этого поста.