Это вопрос дизайна, предполагающий C++ и иерархию ссылочных объектов. Множество классов в моей кодовой базе происходит от общего базового класса (ObjectBase), который реализует методы keep() и release() для увеличения и уменьшения количества ссылок экземпляра объекта.Ссылка на подсчитанные объекты и множественные распределители
Каждый экземпляр объекта может быть создан в стеке или в куче, используя ряд определяемых пользователем распределителей памяти. Чтобы экземпляр объекта совершил самоубийство (удалите это) в методе release(), если keepCount достигает 0, экземпляр должен знать, с каким распределителем он был создан.
В настоящее время я выделяю память для экземпляра объекта с помощью произвольного распределителя, а затем вызываю новое место для построения экземпляра объекта и вызываю метод setAllocator() объекта, чтобы установить создатель, с которым он был создан. Если объект был создан в стеке, распределитель установлен в NULL, а release() не будет вызывать удаление. Этот процесс очень избыточна и привести к ошибкам (утечки памяти, если я забыл позвонить setAllocator, и т.д. ...) В идеале я хотел бы сделать этот процесс один шаг, как это:
Object* o = myPoolAllocator.allocate<Object>(constructor arguments...);
Но это делает очень сложно поддерживать и произвольное количество аргументов конструктора.
Я просто ищу идеи о том, как решить эту проблему. Мне очень нравится идея иметь возможность ссылаться на объекты подсчета, не полагаясь на умный указатель, тем более, что большинство классов вытекает из общей базы, так или иначе.
Благодарим за помощь.
Флориан
casablanca, спасибо за ваш быстрый ответ и спасибо за исправление исходного тега в моем OT! Я рассмотрел аналогичный метод, как вы предлагаете, но, как вы правильно отметили, я больше не буду создавать объекты в стеке. Я думал о проверке в конструкторе ObjectBase, независимо от того, указывает ли поле распределителя на действительный экземпляр распределителя, а если нет, учитывая, что объект находится в стеке. Однако это опасный бизнес, учитывая, что существует некоторая (хотя и небольшая) вероятность того, что неинициализированное поле распределителя просто указывает на действительный распределитель. – FlorianZ
@FlorianZ: Смотрите мой обновленный ответ на еще один возможный взлом. – casablanca
@casablanca. Это тоже неплохая идея! Моя единственная проблема заключается в том, что он, вероятно, не является потокобезопасным. Что делать, если контекстный переключатель возникает после возвращения нового оператора, но до того, как конструктор получит возможность потреблять переменную currentAllocator. Если во втором потоке выполняются распределения, то токАллактор будет скомпрометирован. Любые идеи относительно того, как сделать ваше решение потокобезопасным? – FlorianZ