@communistic_sistema
Биохимик, но в программировании немного шарю

Можно ли вызвать деструктор void*?

Существует вектор std::vector<void*> vec;.
В него кладутся все указатели и приводятся к void*.
Например я хочу положить указатель на класс. Будет ли вызван деструктор класса при delete vec[n];?
Или обязательно явно приводить к указателю на класс? Стандарт С++20.
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Нет. Компилятору же надо знать, что там за деструктор вызывать. Что вы в void* на самом деле положили - он знать не может. Более того, там не только деструкторы, там и delete у указателей вызван не будет. Руками придется сначала привести к правильному типу и потом отчистить память (что вызовет деструктор).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
by_kapt0xa
@by_kapt0xa
Учу кресты катаюсь на велике
нет, нужен полиморфизм
попробуйте почитать про std::variant
допустим, вы собираетессь хранить там не все что угодно, а только double, string и bool
тогда надо написать
using polimorf_ptr = variant<double*, string*, bool*>;
vector<polimorf_ptr> ...; // получается у вас не void*, а polimorf_ptr


!!!!1 обновил:
попробуй использовать PolimorfPtr вместо void*. я на коленке сделал, возможно тебе идея понравится и ты доработаешь:
void no_destructor(void*) {}

struct PolimorfPtr
{
public:
	PolimorfPtr()
		: ptr(nullptr) //надеюсь, ты шаришь за двоеточие
	{}
	PolimorfPtr(const PolimorfPtr&) = delete;
	PolimorfPtr(PolimorfPtr&& other) //надеюсь, ны знаешь что такое r-value - ссылка
		:ptr(other.ptr),
		destructor(other.destructor)
	{
		other.ptr = nullptr;
		other.destructor = no_destructor;
	}
	//мне лень писать оператор =, оператор *, -> и вот это вот все, надеюсь ты знаешь зачем нужны эти операторы и понимаешь о чем я

	PolimorfPtr(void* pointer, void destructor_calling_function(void*) = no_destructor)
		: ptr(pointer),
		destructor(destructor_calling_function)
	{}

	void* ptr; //====================================================== тут хранится указатель
	void (*destructor)(void*) = no_destructor; //===========тут хранится указатель на деструктор (на функцию, которая вызывает деструктор)

	~PolimorfPtr()
	{
		destructor(ptr);
		ptr = nullptr;
		destructor = no_destructor;
	}
};

сори за коментарии для маленьких, я не знаю уровень твоего знания с++, возможно ты с этим уже знаком
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы