Этот вопрос действительно зависит от того, чья ответственность состоит в том, чтобы очистить записи в списке. Если ваша структура отвечает за очистку памяти, на которую ссылаются поля void *
, то здесь у вас есть гораздо более серьезная проблема, а именно то, что при void *
обращении к некоторому произвольному блоку памяти вы никогда не узнаете, что правильно чтобы освободить это. Например, если у вас есть реализация динамического массива в соответствии с C ++ std::vector
, тогда ваш void *
может указывать на структуру, которая сама содержит указатель, и ваш список должен знать, что он должен спускаться в эту структуру, чтобы рекурсивно освободить его динамически распределенный блок. Случай, который вы описываете, где вы пропускаете вложенный список, - это только частный случай этой более общей проблемы.
Если, с другой стороны, список не отвечает за очистку памяти, на которую ссылаются void *
s, которые он хранит, то вам не стоит беспокоиться об этой проблеме вообще.
Если ваш список имеет семантику владения и требуется для очистки памяти для элементов, хранящихся в нем, я настоятельно рекомендую вам использовать магическое число, чтобы определить, есть ли у вас вложенный список. Скорее, вам, вероятно, нужно, чтобы клиент предоставил вам указатель функции, содержащий подпрограмму освобождения для запуска на элементах, вставленных в список. Таким образом, ваш код может использовать предоставленный пользователем код очистки, чтобы обеспечить очистку любых элементов, хранящихся в списке.