MyTetra Share
Делитесь знаниями!
Синтаксис оператора new для выделения произвольного количества байт в виде массива char
Время создания: 09.10.2024 14:54
Автор: Xintrea
Текстовые метки: c++, си++, new, оператор, выделение, память, аллокация, массив, количество, байт, char
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/1728474863yzckz30ycg/text.html на raw.github.com

Стандартный оператор 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);



Примерно так.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования