2014-01-17 3 views
-5

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

Пример:

Obj *test = new test(); 

против

Obj test; 

В чем разница и что точка динамического создания объекта против создания объекта? Я знаю, что одна разница может заключаться в том, что динамически созданная переменная находится в куче, а другая - в стеке, но больше, больше различий?

+1

frist Вы можете освободить динамически созданный. – ncm

+1

'new test(); // on heap' и' Obj test; // on stack' –

+2

Почему, черт возьми, люди закрывают это как «слишком широкое». Это не широко. Это, конечно, плохой вопрос, поскольку ОП не предпринял никаких попыток исследовать этот вопрос. Но он не «слишком широк». –

ответ

0

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

4

У C++ нет понятия кучи и стека. Вместо того, что эти два типа распределения примерно в срок хранения:

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

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

Вы всегда должны использовать автоматическую продолжительность хранения, когда сможете. Вам требуется только динамическая память, когда вам нужен объект, чтобы оставаться в живых между различными областями. Если вам требуется динамическая длительность хранения, вы должны использовать интеллектуальные указатели (например, std::unique_ptr или std::shared_ptr), которые управляют временем жизни объекта динамического выделения для вас. Это поможет избежать утечек памяти.

+2

любая цитата для ** C++ не имеет понятия кучи и стека ** –

+0

@Pilot Единственное упоминание о стеке в стандарте относится к «откату стека» при бросании исключений - но это только что принятая терминология и не обязательно означает, что существует стек. Куча вообще не упоминается. (Очевидно, не считая 'std :: stack' и' make_heap'.) –

+0

'new()' внутренний вызов 'malloc()' ..and 'malloc() == heap'. –

Смежные вопросы