Подтвердить что ты не робот

В чем разница между созданием экземпляра объекта с использованием нового 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 нужно будет удалить, поскольку он был выделен в кучу. Есть ли другая разница?

4b9b3361

Ответ 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;
}