распределение памяти в C ++
-
21-08-2019 - |
Вопрос
Можно ли выделить произвольный блок памяти с помощью оператора "new"?В C я могу сделать это как "void * p = malloc(7);" - это выделит 7 байт, если выравнивание памяти установлено на 1 байт.Как сделать то же самое в C ++ с помощью нового оператора?
Решение
Произвольные блоки памяти могут быть выделены с operator new
в C++;не с помощью new
оператор, который предназначен для построения объектов.
void* pBlock = ::operator new(7);
Такие блоки впоследствии могут быть освобождены с помощью operator delete
.
::operator delete(pBlock);
Обратите внимание , что operator new
будет ли выделенная память соответствующим образом выровнена для любого типа объекта, поэтому реализация может не выделять ровно семь байт и не более, но то же самое (обычно) верно для malloc
.C клиенты malloc
обычно тоже требуется выровненная память.
Другие советы
Другие ответили на вопрос, как написано, но я хотел бы предложить придерживаться malloc / free для таких распределений.
создать и удалить предназначены для выделения объектов.Они выделяют необходимую память и вызывают конструкторы / деструкторы.Если вы знаете, что вам просто нужен произвольный блок памяти, использование malloc и free вполне разумно.
Вы не можете выделить void
указатель с оператором C ++ new
:вам нужно будет выделить явный тип, такой как 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[]
(с помощью []) при освобождении памяти.