Ответ 1
Оба не одинаковы!
Сначала вы получаете поведение Undefined [Ref 1:] или утечку памяти, а вторая - нет, если вы позже вызываете delete
.
MyClass myObject = *new MyClass();
Выделяет объект типа MyClass
на freestore, а затем копирует этот объект в myObject
. Вы теряете указатель на динамически выделенный объект и, следовательно, никогда не сможете его освободить.
Если деструктор MyClass
имеет побочные эффекты, и ваша программа зависит от этих побочных эффектов, тогда он дает вам Undefined поведение, если нет, то то, что у вас есть, - простая простая утечка памяти.
MyClass *myObject = new MyClass();
Выделяет объект типа MyClass
на freestore и точки myObject
на адрес, где размещается динамически выделенный объект. У вас все еще есть указатель на объект, который вы можете освободить, вызывая delete
позже.
Если у вас вопрос, что это лучший способ сделать это,
Ответ заключается в том, чтобы вообще не использовать динамически выделенный объект:
MyClass obj;
Хорошее чтение:
Почему программисты на C++ минимизируют использование "нового" ?
[Ссылка 1:]
С++ 11 Стандарт: 3.8.4:
Программа может завершить время жизни любого объекта, повторно используя хранилище, которое занимает объект, или явно вызвав деструктор для объекта типа класса с нетривиальным деструктором. Для объекта типа класса с нетривиальным деструктором программа не требует прямого вызова деструктора до того, как хранилище, которое объект занимает, повторно используется или освобождается; однако, если нет явного обращения к деструктор или если исключение-выражение (5.3.5) не используется для освобождения хранилища, деструктор не должен быть неявно вызван, и любая программа, зависящая от побочных эффектов, создаваемых деструктором, имеет поведение Undefined.