Использование нового указателя void

int main()
{
    void* Foo = new???
    delete Foo;
}

Как вы делаете что-то подобное выше? Вы не можете поставить new void[size]. И я не хочу знать, как это сделать с помощью malloc() и free(). Я уже знаю, что работает. Мне любопытно и хочу знать, как это сделать с новыми и удалить.

Я искал это и увидел что-то о operator new(size); и operator delete(size);

В чем разница между new/delete? Почему С++ не просто разрешает новый void* [size]?

Ответ 1

Почему С++ не просто разрешает новый void [размер]?

Потому что void не является объектом; он не имеет размера! Сколько места должно быть выделено? Имейте в виду, что new T[size] приблизительно эквивалентно malloc(sizeof(T) * size).

Если вам нужен массив необработанных байтов, вы можете использовать char. *


* Хотя, конечно, потому что это С++, вы должны использовать что-то вроде std::vector<char>, чтобы избежать проблем с утечкой памяти и исключений.

Ответ 2

Это сделает трюк:

int main()
{
    void* Foo = ::operator new(N);
    ::operator delete(Foo);
}

Эти операторы распределяют/освобождают необработанную память, измеренную в байтах, точно так же, как malloc.

Ответ 3

С++ перемещается в построенных объектах, выделенных с использованием некоторого изменения new T. или new T[n] для некоторого типа T. Если вам действительно нужна неинициализированная память (это очень редко получается), вы можете выделить/освободить ее с помощью operator new() и operator delete():

void* ptr = operator new(size);
operator delete(ptr);

(аналогично для форм массива)

Ответ 4

void * преобразуется в любой тип указателя. Вы можете просто сделать void *Foo = new int или любой другой тип, который вы хотите. Но на С++ нет причин делать это.