Для моей программы C++ нужен блок неинициализированной памяти и a void*
указатель на тот блок так, чтобы я мог дать его сторонней библиотеке. Я хочу передать управление времени жизни блока к библиотеке, таким образом, я не хочу использовать std::vector
. Когда библиотека будет сделана с блоком, она назовет обратный вызов, который я должен предоставить, и это освободит блок. В C я использовал бы malloc()
и позже free()
.
В C++ я могу или звонить ::operator new
или ::operator new[]
и ::operator delete
или operator delete[]
соответственно позже:
void* newBlock = ::operator new( sizeOfBlock );
// then, later
::operator delete( newBlock );
Похож на обоих ::operator new
и ::operator new[]
имейте точно ту же подпись и точно то же поведение. То же для ::operator delete
и ::operator delete[]
. Единственная вещь, которую я не должен делать, соединяется operator new
с operator delete[]
и наоборот - неопределенное поведение. Кроме того, какую пару я выбираю и почему?
Используйте new
с одним объектом и new[]
с массивом объектов. Так, например:
int* x = new int; // Allocates single int int* y = new int[5]; // Allocates an array of integers *x = 10; // Assignment to single value y[0] = 8; // Assignment to element of the array
Если вы выделяете буфер памяти, то выделите массив char
, как в:
int bufferlen = /* choose a buffer size somehow */ char* buffer = new char[bufferlen]; // now can refer to buffer[0] ... buffer[bufferlen-1]
Однако в C++ для произвольных массивов следует использовать std::vector
, а для символьных массивов, которые будут интерпретироваться или использоваться как строки, следует использовать std::string
.
Нет причин вызывать ::operator new
или ::operator new[]
явно, а не использовать обычный синтаксис для этих вызовов. Для POD и примитивных типов (например, char
) инициализация не производится. Если вам нужно получить буфер void*
, то просто используйте static_cast
для преобразования char*
в void*
.
Преимущество операторов C ++ new
перед операторами C malloc ()
и free ()
заключается в том, что первый генерирует исключение, если недостаточно памяти, а не возвращает NULL
.
Что касается выбора new (size) и new [] для символьных буферов, я бы рекомендовал последний вариант, поскольку он вряд ли удивит людей, поддерживающих код позже, т.е. char * buf = new char [size]
и удалить [] buf
.
Значения в буфере не будут инициализированы, и здесь нет проверки диапазона - вы должны создать хороший объект C ++, чтобы сделать это за вас, или использовать существующий объект, такой как std :: vector
или std :: string
.
На вопрос нельзя дать разумного ответа.
Во-первых, говорится, что программе «нужен» блок неинициализированной памяти, но, судя по приведенному образцу кода, кажется, что программе «нужен» блок неинициализированной и UNTYPED памяти, что не очень похоже на C ++ или OO.
Во-вторых, std :: vector дает единственный и автоматический контроль над блоком типизированной памяти, размер которого может изменяться или не изменяться в зависимости от его использования. Вы можете потерять этот контроль, если экземпляр std :: vector создается в куче и отслеживается с помощью необработанных указателей, как и для любого другого объекта C или C ++, такого как блок памяти void *.
В-третьих, для чего предназначен этот блок памяти? Ответ на этот вопрос может или не может диктовать использование оператора new или operator new []. Есть ли в конструкции этой программы единственная интерпретация этого блока памяти? Какая семантика владения вам нужна, если таковая имеется? И т. Д. И т. Д.
для выделения памяти массиву / списку используйте new [], кроме этого, используйте new ...