Можно ли с помощью оператора «новый» выделить произвольный блок памяти? В C я могу сделать это как "void * p = malloc (7);" - это выделит 7 байтов, если выравнивание памяти установлено на 1 байт. Как сделать то же самое в C ++ с новым оператором?
выделение памяти в C ++
Ответы (8)
Произвольные блоки памяти могут быть выделены с помощью operator new в C ++; не с оператором new, который предназначен для создания объектов.
void* pBlock = ::operator new(7);
Впоследствии такие блоки можно освободить с помощью operator delete.
::operator delete(pBlock);
Обратите внимание, что operator new будет выделять память, выровненную соответствующим образом для любого типа объекта, поэтому реализация может не выделять ровно семь байтов и не более, но то же самое (обычно) верно для malloc. Клиенты C malloc обычно тоже нуждаются в выровненной памяти.
Другие ответили на вопрос, как написано, но я хотел бы предложить придерживаться malloc / free для таких распределений.
new и delete предназначены для размещения объектов. Они выделяют необходимую память и вызывают конструкторы / деструкторы. Если вы знаете, что вам просто нужен произвольный блок памяти, использование malloc и free вполне разумно.
Вы не можете выделить void указатель с помощью оператора new C ++: вам придется выделить явный тип, такой как char или uint8_t:
char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
Да, можете.
Но в зависимости от того, что вы делаете, могут быть методы получше.
Можете ли вы обновить вопрос и рассказать нам, чего вы пытаетесь достичь. С большим контекстом может быть предоставлено лучшее решение.
Пример:
Если вы динамически выделяли буфер для чтения из сокета (поскольку размер неизвестен во время компиляции). Альтернативой было бы использование вектора и его динамическое изменение размера. Затем вы можете получить указатель на внутреннюю часть буфера, взяв адрес первого элемента.
Лично я бы использовал std::vector<char>. Вы не только получаете произвольный блок байтов (гарантированно смежные), вы получаете их в оболочке RAII. Конечно, нет необходимости использовать какие-либо методы std::vector (кроме, может быть, resize()), но за это нет наказания:
std::vector<char> buffer(7);
void* p = &buffer[0];
Вы можете использовать std::string, но std::string подразумевает, что «этот объект содержит символы, которые имеют смысл при распечатке», где std::vector<char> подразумевает, что «этот объект содержит произвольную группу байтов».
Думаю, вы ищете Новое размещение.
новый символ [7];
Традиционно char - это байт, хотя вы можете найти некоторые библиотеки, которые определяют тип BYTE.
Вы можете сделать char* pBuffer = new char[7];, а поскольку sizeof (char) составляет 1 байт, вы можете использовать его как байтовый буфер. Также не забудьте использовать delete[] (с []) при освобождении памяти.