Министерство цифровых информационных технологий и коммуникаций республики узбекистан каршинский филиал ташкентского университета информационных технологий
Download 98.86 Kb.
|
5-mus
void* operator new(std::size_t size, const std::nothrow_t& nth);
void* operator new[](std::size_t size, const std::nothrow_t& nth); Эти функции определены в глобальном пространстве имен. Функции выделения памяти для размещающих операторов new ничего не делают и просто возвращают ptr. C++17 поддержал дополнительные формы функций выделения и освобождения памяти, с указанием выравнивания. Вот некоторые из них: void* operator new (std::size_t size, std::align_val_t al); void* operator new[](std::size_t size, std::align_val_t al); Эти формы непосредственно пользователю недоступны, их использует компилятор для объектов у которых требования по выравниванию превосходят __STDCPP_DEFAULT_NEW_ALIGNMENT__, поэтому главная проблема состоит в том, чтобы пользователь случайно их не скрыл (см. раздел 2.2.1). Напомним, что в C++11 появилась возможность явно задавать выравнивание пользовательских типов. struct alignas(32) X { /* ... */ }; Перегрузка стандартных форм операторов new/delete заключается в определении пользовательских функций выделения и освобождения памяти, сигнатуры которых совпадают со стандартными. Эти функции можно определить в глобальном пространстве имен или в классе, но не в пространстве имен, отличном от глобального. Функцию выделения памяти для стандартного размещающего оператора new нельзя определить в глобальном пространстве имен. После такого определения соответствующие операторы new/delete будут использовать их, а не стандартные. Пусть, например, в некотором модуле в глобальном пространстве имен определены пользовательские функции: void* operator new(std::size_t size) { // ... } void operator delete(void* ptr) { // ... } В этом случае произойдет фактически подмена (replacement) стандартных функций выделения и освобождения памяти для всех вызовов операторов new/delete для любых классов (в том числе и стандартных) во всем модуле. Это может привести к полному хаосу. Отметим, что описанный механизм подмены — это особый механизм, реализованный только для этого случая, а не какой-то общий механизм C++. В этом случае при реализации пользовательских функций выделения и освобождения памяти становится невозможным вызов соответствующих стандартных функций, они полностью скрыты (оператор :: не помогает) и при попытке их вызвать возникает рекурсивный вызов пользовательской функции. Определенная в глобальном пространстве имен функция Download 98.86 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling