Стандартный оператор new используется для выделения памяти под объекты определённого типа, а не для выделения произвольного количества байт. Если необходимо выделить именно определённое количество байт, можно воспользоваться конструкцией new char[]:
std::size_t numBytes = 100; // Необходимое количество байт
char* buffer = new char[numBytes]; // Выделение массива из 100 байт
В этом примере выделяется массив из 100 байт, а указатель buffer будет указывать на начало этой памяти.
Память, выделенная через new char[], обязательно должна быть освобождена с использованием delete[], вот так:
delete[] buffer; // Освобождение памяти
Важно не забывать в какой форме была выделена память и использовать соответствующий оператор высвобождения, иначе будет утечка памяти, так как при удалении без квадратных скобок [], весь массив не удалится, и такое высвобождение вызовет неопределенное поведение программы (undefined behavior).
* * *
Помимо работы с массивом char, с некоторых пор в стандарте C++ появился так называемый глобальный оператор new. Через него так же можно выделять заданное количество байт:
void* buffer = ::operator new(numBytes);
В данном случае, для указания на начало выделенного куска памяти используется тип void*, который можно статически преобразовывать в указатель на любой тип. Вот как это делается:
// Преобразование к указателю на char
char* charBuffer = static_cast<char*>(buffer);
// Преобразование к указателю на int
int* intBuffer = static_cast<int*>(buffer);
// Преобразование к указателю на пользовательский тип MyType
MyType* myTypePtr = static_cast<MyType*>(buffer);
Примерно так.