Как отличить классы, которые выделяются с помощью пула памяти - PullRequest
4 голосов
/ 02 марта 2012

В проекте у меня есть два вида классов:

  • Тип A: обычно назначаемые классы, которыми я управляю std::unique_ptr<>
  • Тип B: классы, чьи новые были переопределены для выделения памяти из импульсный пул памяти

Для последнего правильное использование - вызывать new, как обычно, для выделения нового экземпляра, , но никогда не вызывать delete. Эти объекты очищаются, когда объект пула памяти выходит из области видимости. .

Поэтому, если я случайно сохраню экземпляр типа B в std::unique_ptr<>, я получу ошибку сегментации. Аналогичным образом, вызов метода delete для указателя типа B. был бы плохой идеей.

Какие механизмы C ++ следует использовать для предотвращения возникновения ошибок такого типа?

В качестве простого, но уродливого исправления я подумываю переименовать все мои классы типа B в префикс, такой как MP (для пула памяти), поэтому я визуально знаю , а не , чтобы вставить их в станд :: unique_ptr <>.

Однако было бы крайне желательно иметь языковой механизм, который может улавливать проблемы во время компиляции или, по крайней мере, умереть более очевидным образом, если я или другие члены моей команды случайно совершат ошибки такого типа.

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

Что ж, я вижу в пуле импульсной памяти, есть одна функция с именем is_from(), которая сообщает, является ли данная память из пула или нет.Сказав это, вы можете переопределить оператор delete, где вы можете проверить, находится ли память из пула повышенной памяти, значит удалить ее, только если она не из пула.Вы также можете использовать произвольное удаление для std::unique_ptr, если оно вам каким-то образом поможет.

3 голосов
/ 02 марта 2012

Вы должны переопределить operator delete тоже.

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