Совсем нет.
В первом примере используется динамическое выделение памяти, т. Е. Вы выделяете экземпляр MyClass
в куче (в отличие от стека).Вам нужно будет вызвать delete
для этого указателя вручную, или вы получите утечку памяти.Кроме того, operator new
возвращает указатель, а не сам объект, поэтому ваш код не будет компилироваться.Его нужно изменить на:
MyClass* x = new MyClass(factory);
Во втором примере выделен экземпляр MyClass
в стеке.Это очень полезно для недолговечных объектов, так как они будут автоматически очищаться при выходе из текущей области (и это быстро; очистка стека не требует ничего, кроме увеличения или уменьшения указателя).
Этотакже, как бы вы реализовали Resource Acquisition - шаблон инициализации , более часто называемый RAII.Деструктор для вашего типа очистит любую динамически выделенную память, поэтому, когда выделенная переменная стека выходит из области видимости, любая динамически выделенная память очищается для вас без необходимости каких-либо внешних вызовов delete
.