Министерство высшего и среднего специального образования республики узбекистана


Download 164.64 Kb.
bet4/5
Sana25.02.2023
Hajmi164.64 Kb.
#1231224
1   2   3   4   5
Bog'liq
ООП

Операции класса new и delete
C++ поддерживает динамическое выделение и освобождение объектов с помощью new операторов и delete операторов. Эти операторы выделяют память для объектов из пула, называемого бесплатным хранилищем (также называемым кучей). Оператор new вызывает специальную функцию operator new, а delete оператор вызывает специальную функцию operator delete.
Компилятор преобразует оператор, такой как этот, в вызов функции operator new:
char *pch = new char[BUFFER_SIZE];
Если запрос равен нулю байтов хранилища, operator new возвращает указатель на отдельный объект. То есть повторяющиеся вызовы для operator new возврата различных указателей.
Если для запроса на выделение недостаточно памяти, operator new возникает std::bad_alloc исключение. Или возвращаетсяnullptr, если вы использовали форму new(std::nothrow)размещения или связали в неисключаемой поддержкеoperator new.
Первый аргумент operator new должен иметь тип size_t, а тип возвращаемого значения всегда void*имеет тип.
Глобальная operator new функция вызывается, когда new оператор используется для выделения объектов встроенных типов, объектов типа класса, не содержащих определяемых operator new пользователем функций, и массивов любого типа. new Если оператор используется для выделения объектов определенного типа operator new класса, вызывается этот классoperator new.
Функция, определенная operator new для класса, является статической функцией-членом (которая не может быть виртуальной), которая скрывает глобальную operator new функцию для объектов этого типа класса. Рассмотрим случай, когда new используется для выделения и задания памяти заданному значению:
#include
#include
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit ); };
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{ void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp; }
int main()
{ Blanks *a5 = new(0xa5) Blanks;
return a5 != 0;}
Аргумент, указанный в скобках new , передается Blanks::operator new в качестве аргумента chInit . Однако глобальная operator new функция скрыта, что приводит к возникновению ошибки, например следующей:
Blanks *SomeBlanks = new Blanks;

Download 164.64 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling