Новые вариации объекта - PullRequest
2 голосов
/ 18 июня 2011

Это очень новый вопрос, но что-то совершенно новое для меня.В моем коде, и везде, где я видел его раньше, новые объекты создаются как таковые ...

MyClass x = new MyClass(factory);

Однако я только что видел пример кода, который выглядит следующим образом ...

MyClass x(factory);

Это делает то же самое?

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Совсем нет.

В первом примере используется динамическое выделение памяти, т. Е. Вы выделяете экземпляр MyClass в куче (в отличие от стека).Вам нужно будет вызвать delete для этого указателя вручную, или вы получите утечку памяти.Кроме того, operator new возвращает указатель, а не сам объект, поэтому ваш код не будет компилироваться.Его нужно изменить на:

MyClass* x = new MyClass(factory);

Во втором примере выделен экземпляр MyClass в стеке.Это очень полезно для недолговечных объектов, так как они будут автоматически очищаться при выходе из текущей области (и это быстро; очистка стека не требует ничего, кроме увеличения или уменьшения указателя).

Этотакже, как бы вы реализовали Resource Acquisition - шаблон инициализации , более часто называемый RAII.Деструктор для вашего типа очистит любую динамически выделенную память, поэтому, когда выделенная переменная стека выходит из области видимости, любая динамически выделенная память очищается для вас без необходимости каких-либо внешних вызовов delete.

2 голосов
/ 18 июня 2011

Нет.Когда вы используете new, вы создаете объекты из кучи, которую затем должны удалить позже.Кроме того, вам действительно нужно MyClass*.Другая форма создает объект в стеке, который будет автоматически уничтожен в конце области действия.

...