Когда объекты должны динамически или автоматически создаваться? - PullRequest
1 голос
/ 14 января 2011

Например, я должен использовать:

Foo* object = new Foo ; 

или я должен просто использовать

Foo object ;

Если я испортил код одного из них, пожалуйста, исправьте. Рано и я новичок.

Ответы [ 7 ]

4 голосов
/ 14 января 2011

В первом случае вы размещаете свой объект Foo в куче, а во втором - в стеке.

Обычно вещи размещаются в куче, если:

  • Foo настолько велик, что не помещается в стек.

  • Вы не знаете, когда выделять свой объект (вам нужно выделить его только при некоторых обстоятельствах).

  • Вам необходимо продлить срок службы вашего объекта также после того, как стек извлечен.

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

4 голосов
/ 14 января 2011

operator new следует избегать везде, где это возможно.Это расточительно во всех областях - синтаксически, семантически и во время выполнения с пространством и временем.Если у вас есть объект, который можно разместить в стеке или статически в классе, сделайте это.Динамическое распределение должно использоваться только тогда, когда вам нужно именно это - динамизм.Если вам не нужно, чтобы он был динамическим, не используйте динамическое размещение.

1 голос
/ 14 января 2011

Автоматическое создание экземпляров должно быть нормой, поскольку время жизни объекта определяется областью действия, а уничтожение происходит автоматически. Динамическая реализация необходима , когда требуется, чтобы объект существовал вне текущей области.

Динамическая реализация также может быть необходима, если объект слишком велик, и у вас ограниченное пространство стека. Однако для одного объекта это было бы необычным случаем, и часто свидетельствует о недостатке дизайна.

Динамическое создание чаще используется для массивов объектов, когда результирующий массив слишком велик для стека или размер массива неизвестен a priori .

Важно помнить, что если вы динамически создаете объект , вы несете ответственность за его явное уничтожение. В противном случае происходит утечка памяти.

1 голос
/ 14 января 2011

По умолчанию в C ++ следует использовать сами объекты, а не указатели (умные или иные), пока нет особых причин поступить иначе.

Чтобы получить объект, построенный по умолчанию, вы должны оставить скобки:

Foo object;

в противном случае компилятор примет это как объявление функции.

0 голосов
/ 14 января 2011

В C ++ указатели следует использовать только тогда, когда вам действительно требуется выделить память в куче (во время выполнения). Одна из целей введения указателей в C состояла в том, чтобы иметь возможность передавать по адресу, чтобы объект, который нужно изменить, можно было передать в качестве параметра. В C ++ вы можете добиться этого, передавая References объектам.

0 голосов
/ 14 января 2011

Второе использование должно быть:

Foo object;

Разница между ними заключается в том, что первый размещает объект в куче, а второй - объект в стеке. Есть много отличий, но вот несколько:

  1. Когда вы выделяете объект в куче, он будет живым, пока вы явно не удалите его, тогда как объект, размещенный в стеке, будет живым только до завершения функции.

  2. Выделение объекта в куче обходится дороже (с точки зрения производительности), чем выделение объектов в стеке.

  3. Как правило, в куче можно выделить гораздо больше объектов, чем в стеке.

  4. Объекты, размещенные в куче, могут передаваться между потоками, тогда как объекты, размещенные в стеке, не могут (это не на 100% правильно, вы можете заставить свою функцию остаться в живых, пока другой поток работает над вашим объектом, но это в значительной степени бесполезно и неэффективно).

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

0 голосов
/ 14 января 2011

Распределение объектов с новым оператором требует очистки после этого с помощью оператора удаления.Поэтому в большинстве случаев, если в этом нет необходимости, я бы использовал статическую реализацию.

Однако, , поскольку статическая реализация помещает объект в стек, вы можете запуститьв проблемы с памятью: стек может содержать только столько данных.Поэтому иногда бывает необходимо создать экземпляр объекта динамически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...