Подтвердить что ты не робот

Новый оператор для распределения памяти в куче

Я смотрел подпись нового оператора. Что есть:

void* operator new (std::size_t size) throw (std::bad_alloc);

Но когда мы используем этот оператор, мы никогда не используем приведение. то есть

 int *arr = new int;

Итак, как С++ преобразует указатель типа void* в int* в этом случае. Потому что даже malloc возвращает void*, и нам нужно явно использовать листинг.

4b9b3361

Ответ 1

В С++ существует очень тонкая разница между operator new и оператором new. (Прочтите это снова... порядок важен!)

Функция operator new является аналогом С++ функции C malloc. Это источник распределения памяти, ответственный только за создание блока памяти, на котором можно создавать объекты. Он не вызывает никаких конструкторов, потому что это не его работа. Обычно вы не видите operator new, который используется непосредственно в коде С++; это выглядит немного странно. Например:

void* memory = operator new(137); // Allocate at least 137 bytes

Оператор new - это ключевое слово, которое отвечает за выделение памяти для объекта и вызов его конструктора. Это то, что чаще всего встречается в коде на С++. Когда вы пишете

int* myInt = new int;

Вы используете новый оператор для выделения нового целого числа. Внутренний оператор new работает примерно так:

  • Выделите память для хранения запрошенного объекта с помощью operator new.
  • Вызывает конструктор объекта, если он есть. Если это порождает исключение, освободите вышеуказанную память с помощью operator delete, а затем распространите исключение.
  • Возвращает указатель на вновь построенный объект.

Поскольку оператор new и operator new являются отдельными, можно использовать ключевое слово new для построения объектов без фактического выделения какой-либо памяти. Например, знаменитое новое размещение позволяет вам создавать объект на произвольном адресе памяти в пользовательской памяти. Например:

T* memory = (T*) malloc(sizeof(T)); // Allocate a raw buffer
new (memory) T(); // Construct a new T in the buffer pointed at by 'memory.'

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

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

Ответ 2

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