Я все еще думаю, что это интересный вопрос без окончательного ответа, но, пожалуйста, позвольте мне разбить его на различные вопросы, которые вы на самом деле задаете:
1.) Вставка указателя на базовый класс в вектор до инициализации подкласса предотвращает или вызывает проблемы с получением унаследованных классов от этого указателя. [нарезка, например.]
Ответ: Нет, пока вы на 100 % уверены в соответствующем типе, на который указывает указатель, этот механизм не вызывает этих проблем, однако обратите внимание на следующие моменты:
Если производный конструктор дает сбой, вы остаетесь с проблемой позже, когда у вас, вероятно, будет висячий указатель, по крайней мере, сидящий в векторе, поскольку это адресное пространство, которое он [производный класс] думал, что оно получает, будет освобождено для операционной среды. в случае неудачи, но вектор по-прежнему имеет адрес типа базового класса.
Обратите внимание, что вектор, хотя и полезный, не является лучшей структурой для этого, и даже если бы это было так, здесь должна быть задействована некоторая инверсия управления, чтобы позволить векторному объекту управлять инициализацией ваших объектов, чтобы вы знали успеха/неудачи.
Эти пункты приводят к подразумеваемому второму вопросу:
2.) Это хороший шаблон для объединения?
Ответ: Не совсем, по причинам, упомянутым выше, а также по другим причинам (проталкивание вектора за его конечную точку в основном заканчивается ненужным malloc и влияет на производительность). В идеале вы хотите использовать библиотеку пула или класс шаблона, и, что еще лучше, отделите реализацию политики выделения/освобождения от реализации пула, с уже намекающим на низкоуровневое решение, которое заключается в выделении адекватной памяти пула из инициализации пула, а затем используйте это с помощью указателей для пустоты изнутри адресное пространство пула (см. решение Alex Zywicki выше.) Используя этот шаблон, уничтожение пула безопасно, поскольку пул, который будет непрерывной памятью, может быть уничтожен в массовом порядке без каких-либо висячих проблем или утечек памяти из-за потери всех ссылок на объект ( потеря всех ссылок на объект, адрес которого выделяется через пул диспетчером хранения, оставляет вас с грязными фрагментами, но не вызовет утечку памяти, поскольку он управляется пулом. ментация.
На заре C/C++ (до массового распространения STL) это был хорошо обсуждаемый шаблон, и в хорошей литературе можно найти множество реализаций и дизайнов: Например:
Кнут (1973 Искусство компьютерного программирования: несколько томов), а более полный список, в том числе о объединении, см.:
http://www.ibm.com/developerworks/library/l-memory/ а>
Третий подразумеваемый вопрос выглядит следующим образом:
3) Является ли это допустимым сценарием для использования пула?
Ответ: Это локализованное дизайнерское решение, основанное на том, что вам удобно, но, честно говоря, ваша реализация (отсутствие управляющей структуры/агрегата, возможно, циклическое совместное использование подмножеств объектов) подсказывает мне, что вам было бы лучше использовать базовый связанный список объектов-оболочек, каждый из которых содержит указатель на ваш суперкласс, используемый только для целей адресации. Ваши циклические структуры построены поверх этого, и вы просто изменяете/расширяете список по мере необходимости, чтобы вместить все ваши объекты первого класса по мере необходимости, а когда закончите, вы можете легко уничтожить их в эффективной операции O (1) из связанного списка.
Сказав это, я бы лично порекомендовал в это время (когда у вас есть сценарий, в котором пул действительно используется, и поэтому вы находитесь в правильном мышлении) выполнить создание набора классов управления хранилищем/пула, которые являются параматеризованными/бестиповыми сейчас, так как это сослужит вам хорошую службу в будущем.
person
Community
schedule
22.10.2014
B
нужно знать о пуле памяти? Добавление указателей из кода драйвера (main
) кажется неизмеримо более предпочтительным. И тогда, конечно, время жизни пула может быть ограничено, что, в свою очередь, означает, что вы получаете бесплатное уничтожение, когда оно выходит за рамки. - person Jon   schedule 04.05.2013new D(...)
наmemory_pool.emplace_back(new D(...))
? Я полагаю, что мог бы написать шаблонную функцию в стилеmake_shared
, которая создает объект, передает аргументы конструктору и добавляет его в пул памяти. Я все еще хотел бы знать, является ли приведенный выше код UB или нет. - person Andrew Tomazos   schedule 04.05.2013