Создание переменной в куче или стеке в C ++ - PullRequest
2 голосов
/ 21 октября 2010

Circle - это класс с открытым методом GetDiameter(). В чем разница между следующими 2 наборами кода?

Qn1: Распределяет Метод 1 выделяет ли память для c на стек (следовательно, не требуется свободная память), тогда как Метод 2 выделяет память для c на куча (нужна свободная память вручную)?

Qn2: Когда мы должны использовать метод 1 или метод 2?

Метод 1:

void Init()
{
 Circle c;
 c.GetDiameter();

 return;
}

Метод 2:

void Init()
{
 Circle *c = new Circle();
 c->GetDiameter();

 return;
}

Ответы [ 7 ]

10 голосов
/ 21 октября 2010

Как правило для хорошей практики кодирования, всегда используйте метод 1, когда это возможно.Метод 2 следует использовать только в том случае, если вам нужно хранить и / или совместно использовать указатель в разных местах.Все объекты, используемые только локально в методе или классе, должны быть помещены в стек.

6 голосов
/ 21 октября 2010

Используйте метод 2, когда:

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

Последняя методика обычно используется для обработки полиморфизма, поэтому тип, который вы получаете, может на самом деле быть не типом указателя, а классом, производным от него.

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

Если естьочистка для выполнения в конце функции, в идеале это должно быть сделано с помощью автоматических объектов (таких как scoped_ptr или auto_ptr).Это гарантирует, что очистка произойдет, даже если функция завершается досрочно (например, генерируется исключение).Этот метод называется RAII - Инициализация ресурсов - это инициализация.

2 голосов
/ 21 октября 2010

одно из лучших обсуждений кучи против стека, которое я видел, находится здесь: кучи против стека (прокрутите вниз до середины обсуждения)

краткое резюме:

stack: время жизни объекта контролируется компилятором куча: время жизни объекта контролируется программистом
2 голосов
/ 21 октября 2010

Да, метод 1 размещает в стеке и, следовательно, нет необходимости освобождать, тогда как метод 2 выделяет в куче, которая должна быть освобождена.

  1. Используйте стек, если вы не хотите, чтобы объект после окончанияфункция
  2. Используйте Heap, если вы хотите сохранить объект живым и после выхода из функции (при условии сохранения выделенного адреса)
1 голос
/ 21 октября 2010

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

1 голос
/ 21 октября 2010

Метод 1: память выделена в стеке. Способ 2: память выделяется в куче. + Как правило, если вы используете вызов 'new', вы должны вызвать 'delete', чтобы освободить память.

0 голосов
/ 21 октября 2010

Стек

  • Ограниченный и фиксированный размер
  • Stricked Last in Time времени жизни объекта FirstOut (обычно ограничивается функцией включения)

Heap

  • Размер обычно ограничен только размером системной памяти
  • Время жизни управляемого вручную объекта

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

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