Оба ваших конструктора копирования для ObjectAllocator
создают новый экземпляр boost::pool
каждый раз, когда их вызывают.
Когда std::allocate_shared
копирует распределитель ( cppreference ), экземпляр ObjectAllocator
, использованный для выделения std::shared_ptr
, разрушается вместе с его пулом до уничтожения shared_ptr
.
Смежный вопрос: Проблемы с выделением памяти в C ++ с удалением выделения памяти
Возможно, это не связано с вашей проблемой, но есть и несколько других проблем:
thread1
в main
. Это вызовет std::terminate
и приведет к сбою вашей программы. boost::pool<> ObjectAllocator::pool_(block_size);
- часть ObjectAllocator::
является лишней и нестандартной. (afaik принимается только в MSVC) Лично, я примкнул бы шаг проблема путем переименования IEnumerable<T>
метод к AddRange
. Это избегает таких проблем и согласовывается с существующими API такой как List<T>.AddRange
.
Это также содержит вещи в чистоте, когда T
Вы захотите добавить реализации IEnumerable<T>
(редкий, я признаю).
Можно использовать: typeof(T)
if (typeof(T) == typeof(object) ) {
// Check for IEnumerable
}
Если Вы хотите использовать is
оператор в универсальном классе/методе, необходимо ограничить T
ссылочным типом:
public void MyMethod<T>(T theItem) where T : class
{
if (theItem is IEnumerable) { DoStuff(); }
}