Объекты указателя C++ по сравнению с не объекты указателя [дубликат]

17
задан Community 23 May 2017 в 11:54
поделиться

7 ответов

Причины использования динамического хранилища включают (но, вероятно, не ограничиваются)

  1. Ручное управление временем жизни объектов - объект будет жить до тех пор, пока вы его явно не уничтожите.
  2. Создание необходимого количества объектов, когда окончательное число объектов известно только во время выполнения (например, количество узлов в дереве или количество элементов в массиве).
  3. Текущий контроль типа объекта (например, фактический тип полиморфного объекта).

Когда это не имеет значения, всегда лучше создать объект, используя метод t3 . Не используйте динамическую память без необходимости. Но иногда это действительно необходимо (см. Причины выше).

20
ответ дан 30 November 2019 в 11:22
поделиться

Главное отличие в том, где он находится в памяти. «Версия без указателя» находится в стеке, что означает, что она будет недействительной после возврата из функции, в то время как «версия с указателем» находится в куче, что означает, что она будет жива и здорова, пока кто-то не вызовет delete в теме. В общем, считается лучшей практикой помещать объекты в стек, когда это возможно, и только в куче, когда это необходимо. Хорошим примером необходимости объекта в куче может быть что-то вроде этого

Obj* f()
{
  return new Obj();
}

: new Obj () создает объект Obj в куче и возвращает указатель на него, который затем возвращается из функции.

Это, например, НЕ будет работать

Obj* f()
{
  Obj o1;
  return &o1;  //BAD!!
}

Поскольку значение указателя & o1 ссылается на память в стеке, а функция f () удаляется из стека в этот момент, кто знает, что произойдет. Однозначно ничего хорошего.

2
ответ дан 30 November 2019 в 11:22
поделиться

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

Еще одна причина использования указателей - это "исходящие" параметры. Конечно, вы можете использовать ссылки, но многие предпочитают использовать указатели, поскольку это позволяет избежать изменения параметра на сайте вызова. foo (var); vs foo (& var);

Кроме того, указатели могут использоваться для передачи или возврата объекта, который может существовать или не существовать. Например: T * foo (); // возвращает указатель на объект или NULL, если его нет .

Этот список можно продолжать и продолжать.

7
ответ дан 30 November 2019 в 11:22
поделиться

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

1
ответ дан 30 November 2019 в 11:22
поделиться

Если у вас есть очень большой объект (например, с очень большими буферами в качестве членов), вы можете не захотеть размещать его в стеке, поскольку стек пространство ограничено, в этом случае вы выделяете в куче с помощью оператора new.

4
ответ дан 30 November 2019 в 11:22
поделиться

Любой тип динамических структур данных (списки, двоичные деревья, стеки и т. Д.) Должен использовать указатели на объекты .

3
ответ дан 30 November 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: