Объекты указателя С++ или объекты без указателя
Возможный дубликат:
Почему вы хотите выделить память в куче, а не в стеке?
Test2 *t2 = new Test2();
t2->test();
Test2 t3;
t3.test();
Почему я хочу создать объект-указатель типа Test2? Почему бы просто не использовать указатель версии Test2? Почему я хочу делать объекты-указатели?
Найден ответ здесь:
Ответы
Ответ 1
Причины использования динамического хранилища включают (но, вероятно, не ограничиваются)
- Ручное управление временем жизни объектов - объект будет жить, пока вы явно не уничтожите его.
- Создание как можно большего количества объектов, когда конечное число объектов известно только во время выполнения (например, количество узлов в дереве или количество элементов в массиве).
- Контроль времени выполнения объекта (например, фактический тип полиморфного объекта).
Если это не имеет значения, всегда лучше создать объект с помощью метода t3
. Не используйте динамическую память, если это необходимо. Но иногда вам действительно нужно (см. Причины выше).
Ответ 2
Если вам нужен объект, чтобы пережить область, в которой он был создан, тогда одним из решений было бы создать его в куче. В этом случае вам понадобится указатель. Есть и другие причины, это наиболее распространенное явление.
Другая причина использования указателей - для параметров "out". Конечно, вы можете использовать ссылки, но многие предпочитают использовать указатели, так как он устраняет изменение параметра на сайте вызова. foo(var);
vs foo(&var);
Кроме того, указатели могут использоваться для передачи или возврата объекта, который может или не может существовать. Например: T *foo(); // returns a pointer to an object or NULL if none exists
.
Список можно продолжать и продолжать.
Ответ 3
Если у вас очень большой объект (например, один с очень большими буферами в качестве членов), вы можете не захотеть его выделять в стеке, поскольку пространство стека ограничено, в этом случае вы выделяете кучу с помощью оператора new.
Ответ 4
Некоторые похожие вопросы для вас:
Ответ 5
Любой тип динамических структур данных (списки, двоичные деревья, стеки и т.д.) должен использовать указатели на объекты.
Ответ 6
Основное различие заключается в том, где он живет в памяти. "Не указательная версия" живет в стеке, что означает, что она будет недействительной после возвращения функции, в то время как "версия указателя" живет в куче, а это значит, что она будет живой и здоровой, пока кто-то не назовет ее delete
. В общем, считается лучшей практикой поместить объекты в стек, когда это возможно, и только на кучу, когда это необходимо. Хорошим примером необходимости объекта в куче было бы что-то вроде этого
Obj* f()
{
return new Obj();
}
new Obj()
создает объект Obj
в куче и возвращает указатель на него, который затем возвращается из функции.
Это, например, НЕ работает
Obj* f()
{
Obj o1;
return &o1; //BAD!!
}
Так как значение указателя &o1
ссылается на память в стеке, а f() очищается от стека в этой точке, кто знает, что произойдет. Определенно ничего хорошего.
Ответ 7
Общая (но не обязательная) реализация заключается в том, что локальные переменные выделяются в стеке. Стек является конечным, и возможно, чтобы объект был слишком большим для размещения в стеке.