.NET: Как проверить тип в универсальном введенном классе?

Оба ваших конструктора копирования для 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)

15
задан Mark Cidade 24 October 2008 в 11:19
поделиться

3 ответа

Лично, я примкнул бы шаг проблема путем переименования IEnumerable<T> метод к AddRange. Это избегает таких проблем и согласовывается с существующими API такой как List<T>.AddRange .

Это также содержит вещи в чистоте, когда T Вы захотите добавить реализации IEnumerable<T> (редкий, я признаю).

22
ответ дан 1 December 2019 в 00:21
поделиться

Можно использовать: typeof(T)

if (typeof(T) == typeof(object) ) {
    // Check for IEnumerable
}
29
ответ дан 1 December 2019 в 00:21
поделиться

Если Вы хотите использовать is оператор в универсальном классе/методе, необходимо ограничить T ссылочным типом:

public void MyMethod<T>(T theItem) where T : class
{
    if (theItem is IEnumerable) { DoStuff(); }
}
-1
ответ дан 1 December 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: