управление памятью & std :: allocator - PullRequest
6 голосов
/ 23 ноября 2010

При просмотре своего кода я вижу некоторую «уродливую» структуру, которую я использую, в классе (называемом «карта») у меня есть вектор, который содержит класс «данных»:

std::vector<PointerToHUGEClass> vector;

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

only причина, по которой я использую "PointerToHUGEClass" вместо просто "HUGEClass", заключается в том, что я хотел убедиться, чтообъект не объявлен из стека.Это было сделано, однако, прежде чем я понял, распределители.Теперь я чувствую, что задача распределителя заключается в том, чтобы не объявлять память из стека.

Мои вопросы:

  • AmЯ правильно предположил, что распределитель отвечает за управление памятью из элементов?(И убедитесь, что он объявлен из стека / freestore / heap / что угодно)
  • Что делает std :: allocator?- Объявляется ли это из стека или из кучи?
  • (в соответствии с предыдущим вопросом): если я копирую элемент, объявленный в стеке, в структуру данных, он все еще объявляется в куче?

Еще раз спасибо, Павел23

Ответы [ 2 ]

9 голосов
/ 23 ноября 2010
  • Правильно ли я считаю, что распределитель отвечает за управление памятью из элементов? (И убедитесь, что он объявлен из стека / freestore / heap / что угодно)

Нет, ты не. Распределитель просто покрывает сахаром над new и delete и в целом отвечает за принятие решения , где будет выделена память. Ответственность за звонки allocate, deallocate, construct и destruct лежит на его пользователях (что означает здесь std::vector). С вашей точки зрения, это будет автоматически, что в конечном итоге имеет значение.

  • Что делает std :: allocator? - Он объявляется из стека или из кучи?

std::allocator назначается с использованием ::operator new(size_t), поэтому оно зависит от определения глобального оператора new. Как правило, это означает кучу. Стек предназначен для объекта с автоматической продолжительностью хранения.

  • (продолжение предыдущего вопроса): если я скопирую элемент, объявленный в стеке, в структуру данных, он все равно будет объявлен в куче?

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

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

0 голосов
/ 23 ноября 2010

Ваши ответы:

  • Да, вы правы. В любом случае, если тип шаблона контейнера является указателем, как в вашем случае, контейнер будет выделять / освобождать память для указателя, а не для объекта, на который указывает указатель!

  • Это до реализации, в $ 20.2.5 стандарта описаны требования распределителей.

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

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...