Использование нового указателя 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
или любой другой тип, который вы хотите. Но на С++ нет причин делать это.