Переменные стека C ++ и переменные кучи - PullRequest
9 голосов
/ 17 сентября 2010

Когда вы создаете новый объект в C ++, который живет в стеке (как я обычно это видел), вы делаете это:

CDPlayer player;

Когда вы создаете объект в куче, вы вызываетеnew:

CDPlayer* player = new CDPlayer();

Но когда вы делаете это:

CDPlayer player=CDPlayer();

, это создает объект на основе стека, но в чем разница между этим и лучшим примером?

Ответы [ 3 ]

22 голосов
/ 17 сентября 2010

Разница важна для POD (в основном, для всех встроенных типов, таких как int, bool, double и т. Д. Плюс C-подобные структуры и объединения, построенные только из других POD), для которых существуетразница между инициализацией по умолчанию и инициализацией значения .Для POD простой

T obj;

оставит obj неинициализированным, тогда как T() по умолчанию инициализирует объект.Так что

T obj = T();

- это хороший способ убедиться, что объект правильно инициализирован.

Это особенно полезно в коде шаблона, где T может быть POD или не POD типа.Когда вы знаете, что T не является типом POD, достаточно T obj;.

Приложение: Вы также можете написать

T* ptr = new T; // note the missing ()

(и избежать инициализации выделенного объекта, если T является POD).

8 голосов
/ 17 сентября 2010

Когда вы создаете новый объект в C ++, который живет в стеке, (…) вы делаете это:

CDPlayer player;

Не обязательно в стеке: переменные, объявленные таким образоместь автоматическое хранилище .Куда они на самом деле идут, зависит.Он может находиться в стеке (в частности, когда объявление находится внутри метода), но также может быть где-то еще.

Рассмотрим случай, когда объявление находится внутри класса:

class foo {
    int x;
};

Теперь хранилище x находится там, где хранится экземпляр класса.Если он хранится в куче, то x:

foo* pf = new foo(); // pf.x lives on the heap.
foo f; // f.x lives where f lives, which has (once again) automatic storage.
0 голосов
/ 17 сентября 2010
CDPlayer* player = new CDPlayer();

На самом деле это создает указатель на стек и указывает на объект CDPlayer, выделенный в куче.

...