Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Выделение памяти в C ++

Автор вопроса: user132349Ответов: 8

Можно ли с помощью оператора "новый" выделить произвольный блок памяти? В C я могу сделать это как "void * p = malloc (7);" - это выделит 7 байтов, если выравнивание памяти установлено на 1 байт. Как сделать то же самое в C ++ с новым оператором?

c++memorynew-operator

Ответы

Ответ 1 · рейтинг 45 · CB Bailey

Произвольные блоки памяти могут быть выделены с помощью operator new в C ++; не с оператором new, который предназначен для создания объектов.

void* pBlock = ::operator new(7);

Впоследствии такие блоки можно освободить с помощью operator delete.

::operator delete(pBlock);

Обратите внимание, что operator new будет выделять память, выровненную соответствующим образом для любого типа объекта, поэтому реализация может не выделять ровно семь байтов и не более, но то же самое (обычно) верно для malloc. Клиенты C malloc обычно тоже нуждаются в выровненной памяти.

Ответ 2 · рейтинг 11 · dma

Другие ответили на вопрос, как написано, но я хотел бы предложить придерживаться malloc / free для таких распределений.

new и delete предназначены для размещения объектов. Они выделяют необходимую память и вызывают конструкторы / деструкторы. Если вы знаете, что вам просто нужен произвольный блок памяти, использование malloc и free вполне разумно.

Ответ 3 · рейтинг 8 · Adam Rosenfield

Вы не можете выделить void указатель с помощью оператора new C ++: вам придется выделить явный тип, такой как char или uint8_t:

char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;

Ответ 4 · рейтинг 3 · Martin York

Да, можете.
Но в зависимости от того, что вы делаете, могут быть методы получше.

Можете ли вы обновить вопрос и рассказать нам, чего вы пытаетесь достичь. С большим контекстом может быть предоставлено лучшее решение.

Пример:
Если вы динамически выделяли буфер для чтения из сокета (поскольку размер неизвестен во время компиляции). Альтернативой было бы использование вектора и его динамическое изменение размера. Затем вы можете получить указатель на внутреннюю часть буфера, взяв адрес первого элемента.

Ответ 5 · рейтинг 3 · Max Lybbert

Лично я бы использовал std::vector<char>. Вы не только получаете произвольный блок байтов (гарантированно смежные), вы получаете их в оболочке RAII. Конечно, нет необходимости использовать какие-либо методы std::vector (кроме, может быть, resize()), но за это нет наказания:

std::vector<char> buffer(7);
void* p = &buffer[0];

Вы можете использовать std::string, но std::string подразумевает, что "этот объект содержит символы, которые имеют смысл при распечатке", где std::vector<char> подразумевает, что "этот объект содержит произвольную группу байтов".

Ответ 6 · рейтинг 2 · Michael Kristofik

Думаю, вы ищете Новое размещение.

Ответ 7 · рейтинг 2 · Stefan Mai

новый символ [7];

Традиционно char - это байт, хотя вы можете найти некоторые библиотеки, которые определяют тип BYTE.

Ответ 8 · рейтинг 2 · Naveen

Вы можете сделать char* pBuffer = new char[7];, а поскольку sizeof (char) составляет 1 байт, вы можете использовать его как байтовый буфер. Также не забудьте использовать delete[] (с []) при освобождении памяти.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы