Вопрос

Можно ли выделить произвольный блок памяти с помощью оператора "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[] (с помощью []) при освобождении памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top