В чем разница между созданием экземпляра объекта с использованием нового vs.
В С++,
Помимо динамического распределения памяти, существует ли разница между двумя строками кода:
Time t (12, 0, 0); //t is a Time object
Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object
Я предполагаю, конечно, что определено время (int, int, int) ctor. Я также понимаю, что во втором случае t нужно будет удалить, поскольку он был выделен в кучу. Есть ли другая разница?
Ответы
Ответ 1
Строка:
Time t (12, 0, 0);
... выделяет переменную типа Time
в локальной области, обычно в стеке, которая будет уничтожена при завершении ее области.
В отличие от этого:
Time* t = new Time(12, 0, 0);
... выделяет блок памяти, вызывая либо ::operator new()
, либо Time::operator new()
, а затем вызывает Time::Time()
с this
, установленным на адрес в этом блоке памяти (а также возвращается как результат new
), который затем сохраняется в t
. Как вы знаете, это обычно сделано в куче (по умолчанию) и требует, чтобы вы delete
позже в программе, а указатель в t
- вообще хранится в стеке.
Ответ 2
Еще одно очевидное отличие заключается в доступе к переменным и методам t.
Time t (12, 0, 0);
t.GetTime();
Time* t = new Time(12, 0, 0);
t->GetTime();
Ответ 3
Что касается конструктора, то две формы функционально идентичны: они просто вызовут вызов конструктора для вновь выделенного экземпляра объекта. Вы, похоже, хорошо понимаете различия в режимах распределения и времени жизни объектов.
Ответ 4
Я думаю, вы уже понимаете все различия. Предполагая, что вам хорошо известно о различии синтаксиса доступа к элементу t через указатель и через переменную (ну, указатель также является переменной, но, я думаю, вы понимаете, что я имею в виду). Предполагая также, что вы знаете разницу в вызове по значению и вызов по ссылке при передаче t функции. И я думаю, вы также понимаете, что произойдет, если вы назначите t другой переменной и внесите изменения через эту другую переменную. Результат будет отличаться в зависимости от того, является ли указатель t или нет.
Ответ 5
Функциональная разница между объектом и распределением его в куче не существует. Оба будут вызывать конструктор объекта.
Кстати, я рекомендую вам использовать boost shared_ptr или scoped_ptr, который также функционально эквивалентен при распределении в куче (с дополнительной полезностью scoped_ptr, ограничивающей вас от копирования не скопируемых указателей):
scoped_ptr<Time> t(new Time(12, 0, 0));
Ответ 6
Нет.. Нет другой разницы.
Ответ 7
Нет другой разницы в том, что вы уже знаете.
Предполагая, что ваш код использует службу оператора по умолчанию new.
Ответ 8
- Использовать новое:
Вызовите оператор новой функцией, чтобы получить динамическую память, а затем вызвать функцию constuctor.
- Не использовать новое:
Не будет вызывать функцию оператора new, просто для вызова функции constuctor. Стек будет использоваться напрямую, без использования malloc.
Ответ 9
void foo (Time t)
{
t = Time(12, 0, 0);
}
void bar (Time* t)
{
t = new Time(12, 0, 0);
}
int main(int argc, char *argv[])
{
Time t;
foo(t);//t is not (12,0,0),its value depends on your defined type Time default constructor.
bar(&t);//t is (12,0,0)
return 0;
}