2012-02-28 2 views
0

Можно создать дубликат:
When should I use the new keyword in C++?Когда следует использовать «новое»?

Я не знаю разницу между случай 1 и случай 2:

Я определения структуры ниже:

struct Graph { 
    int ID; 
} 

Дело 1:

Graph g; 
g.ID = 1; 

случай 2:

Graph* g = new G(); 
g.ID = 1; 

Являются ли эти два случая то же самое? Какая разница?

+0

Благодарим за внимание! – LoveTW

+1

Если точка с запятой добавлена ​​в конце определения 'struct', тогда может быть скомпилирован случай 1. –

ответ

3

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

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

Кроме того, в случае 2, поскольку г является указателем, вы должны быть доступ поля г, используя оператор ->:

g->ID = 1; 
1

В случае 2 вы имеете в виду new Graph, а затем g->ID = 1. Попробуйте начать с http://en.wikipedia.org/wiki/New_(C%2B%2B). Краткая история, случай 1 выделяет память во время компиляции, а случай 2 выделяет ее во время выполнения.

1

Разница заключается в том, где выделяются данные.

В случае 1 данные для вашей структуры Graph выделены в стеке. Вы получаете доступ к нему через имя «g».

В случае 2 данные для вашей структуры Graph выделены в куче. Вы получаете доступ к нему с помощью указателя на эти данные, который хранится через имя «g».

1

В случае 1, вы создаете графикам на стеке, в пределах локальный охват. Таким образом, он автоматически удаляется при завершении области. g является, таким образом, фактической экземплярной версией этого Графа.

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

+0

В этом контексте HEap и Stack не являются полезными понятиями. Термины, которые вы ищете, это «автоматическая продолжительность хранения» и «динамическая длительность хранения». Проблема с кучей и стеком заключается в том, что вещи запутываются, когда у вас есть члены объекта, который был динамически распределен. У динамически выделенного объекта есть «динамическая длительность хранения», а его члены (если не указатели) - это «автоматическая продолжительность хранения» (хотя члены находятся в куче) и будут корректно очищены, когда объект будет уничтожен. –

+0

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

+0

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

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