Не делайте этого!
Вызов delete
на void pointer
является неопределенным поведением . [Ссылка ниже]
Неопределенное поведение означает, что что-то может случиться, программа может иногда зависать или иногда работать, но вы не можете предсказать ее поведение в любое время, что является очень плохим способом программирования.
Как вы правильно поняли с помощью void*
, оператор delete
никак не может определить, какой деструктор класса ему нужно вызвать, в конце концов, что приведет к неопределенному поведению.
Так, как я могу заставить эту работу работать?
Как я понимаю, Ваше намерение иметь указатель void*
состоит в том, чтобы иметь реализацию общего списка ссылок.C ++ уже предоставляет шаблонный общий список ссылок std :: list для этой цели. Вы можете использовать его, поскольку нет смысла заново изобретать колесо, и, скорее всего,стандартная реализация списка ссылок будет лучше, чем любая настраиваемая версия общего списка ссылок.
Если вы все еще хотите иметь свою собственную версию списка ссылок.Вы должны реализовать универсальный класс списка ссылок на шаблоны, что делает std :: list .
Посмотрите на Программирование шаблонов .
Ссылка:
Согласно C ++ 03 Стандартный раздел 5.3.5 / 3:
В первом варианте (удаление объекта), если статический тип операнда отличается от его динамического типа, статический типдолжен быть базовым классом динамического типа операнда, а статический тип должен иметь виртуальный деструктор или поведение не определено.Во втором варианте (удаление массива), если динамический тип удаляемого объекта отличается от его статического типа, поведение не определено (FootNote 73).
Foot Note 73)
Это означает, что объект нельзя удалить, используя указатель типа void *, поскольку нет объектов типа void