2016-11-30 16 views
0

Мне нужно объявить и инициализировать вектор как поле класса с именем PixelOperator.Как должны быть объявлены поля классов на C++?

Я разорван между этими двумя методами объявления, первый - «на куче», а второй «на стек» (или, по крайней мере, это моя интерпретация).

  1. vector<int>* field = new vector<int>();
  2. vector<int> field = vector<int>();

Если я выбираю объявить в стиле номер 1, мне нужно позвонить удалить в деструкторе класса.

Какой из них выбрать, и почему?

Также, если класс инициализирован в куче (т.е. PixelOperator* op = new PixelOperator();), являются ли инициализированы поля в стеке, инициализированном в куче?

ответ

2

В этом случае ваша интуиция неверна. Подход (2) не обязательно помещает вектор в стек. Если объект PixelOperator объявлен локально и, таким образом, помещен в стек, вектор также помещается в стек, , но если объект PixelOperator помещается в кучу с использованием нового оператора, вектор также попадает в кучу как часть этого объекта. Разница в этом случае заключалась бы в том, что в подходе (2) вектор является частью смежного блока памяти вместе с другими объектными полями, а в подходе (1) блок памяти, содержащий объект, имеет в себе адрес другого блока памяти, которая содержит вектор. Конечно, в подходе (1) вектор заканчивается на куче независимо от того, помещен ли объект PixelOperator в кучу или в стек. Подход (2) обычно более желателен, так как он обеспечивает большую прозрачность, определяющую, где объект распределяется.

3

Выберите метод 2. Это поставит объект в стек, но реализация вектора, скорее всего, поместит содержимое в кучу.

Кроме того, у вас есть значения в обратном порядке. 1 находится в куче, 2 - в стеке. 1 потребуется удалить.

+2

Правильно, за исключением того, что метод 2 поместит вектор везде, где будет помещен объект «PixelOperator», который может находиться в стеке (PixelOperator pix; '), или он может быть в куче (« PixelOperator * pix = new PixelOperator; '). –

1

Не на что наткнуться. В куче никогда не было причин выделять std::vector<> (или любой другой стандартный контейнер). Просто никогда не делай этого, и с тобой все будет в порядке.

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

  • Нет связанных вопросов^_^