Чтобы использовать - “оператор новый” или “оператор, новый []” - для выделения блока необработанной памяти в C++?

Для моей программы 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[] и наоборот - неопределенное поведение. Кроме того, какую пару я выбираю и почему?

8
задан sharptooth 26 March 2010 в 15:06
поделиться

4 ответа

Используйте 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*.

7
ответ дан 5 December 2019 в 18:58
поделиться

Преимущество операторов C ++ new перед операторами C malloc () и free () заключается в том, что первый генерирует исключение, если недостаточно памяти, а не возвращает NULL .

Что касается выбора new (size) и new [] для символьных буферов, я бы рекомендовал последний вариант, поскольку он вряд ли удивит людей, поддерживающих код позже, т.е. char * buf = new char [size] и удалить [] buf .

Значения в буфере не будут инициализированы, и здесь нет проверки диапазона - вы должны создать хороший объект C ++, чтобы сделать это за вас, или использовать существующий объект, такой как std :: vector или std :: string .

1
ответ дан 5 December 2019 в 18:58
поделиться

На вопрос нельзя дать разумного ответа.

Во-первых, говорится, что программе «нужен» блок неинициализированной памяти, но, судя по приведенному образцу кода, кажется, что программе «нужен» блок неинициализированной и UNTYPED памяти, что не очень похоже на C ++ или OO.

Во-вторых, std :: vector дает единственный и автоматический контроль над блоком типизированной памяти, размер которого может изменяться или не изменяться в зависимости от его использования. Вы можете потерять этот контроль, если экземпляр std :: vector создается в куче и отслеживается с помощью необработанных указателей, как и для любого другого объекта C или C ++, такого как блок памяти void *.

В-третьих, для чего предназначен этот блок памяти? Ответ на этот вопрос может или не может диктовать использование оператора new или operator new []. Есть ли в конструкции этой программы единственная интерпретация этого блока памяти? Какая семантика владения вам нужна, если таковая имеется? И т. Д. И т. Д.

1
ответ дан 5 December 2019 в 18:58
поделиться

для выделения памяти массиву / списку используйте new [], кроме этого, используйте new ...

0
ответ дан 5 December 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: