2010-11-23 5 views
5

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

std::vector<PointerToHUGEClass> vector; 

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

только Причина: Я использую «PointerToHUGEClass» вместо «HUGEClass», потому что я хотел убедиться, что объект не объявлен из стека. Это было сделано, прежде чем я понял ассистентов. Теперь я чувствую, что задача распределителя состоит в том, чтобы гарантировать, что память не объявлена ​​из стека.

Мои вопросы:

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

Еще раз спасибо, paul23

+0

@ Симон: хмм, этот код должен читать `std :: vector ` или `std :: vector ` Спасибо, что заметили. (Хотя это не меняет мои вопросы, вопросы более общие, поскольку это то, о чем я уже давно интересовался) – paul23 2010-11-23 10:12:55

ответ

8
  • Я правильно предполагая аллокатора отвечает за управление памятью из пунктов? (И не убедившись, что он объявлен из стека/FreeStore/кучного/все)

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

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

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

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

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

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

+0

Можете ли вы рассказать мне, где находится std :: allocator, который должен использовать :: operator new? Я не могу найти ссылку в стандарте. – Simone 2010-11-23 10:25:13

0

Ваши ответы:

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

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

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

НТН

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