Объекты указателя С++ или объекты без указателя

Возможный дубликат:
Почему вы хотите выделить память в куче, а не в стеке?

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

Общая (но не обязательная) реализация заключается в том, что локальные переменные выделяются в стеке. Стек является конечным, и возможно, чтобы объект был слишком большим для размещения в стеке.