Поделиться через


Функция оператор new

При обнаружении в программе оператора, подобного показанному ниже, он преобразуется в вызов функции operator new.

Заметки

char *pch = new char[BUFFER_SIZE];

Если запрос предназначен для нуля байтов памяти, operator new возвращает указатель на конкретный объект (т. е. повторные вызовы функции operator new возвращают разные указатели). Если недостаточно памяти для выполнения запроса на выделение, функция operator new возвращает значение NULL или создает исключение (дополнительные сведения см. в разделе Операторы new и delete ).

Можно написать процедуру, которая будет пытаться освободить память и повторить попытку выделения; дополнительные сведения см. в разделе _set_new_handler. Более подробные сведения о схеме восстановления см. в разделе Обработка в случаях нехватки памяти.

В следующей таблице описаны две области для функций operator new.

Области для функций operator new

Оператор

Область

::operator new

Global

имя-класса::operator new

Класс

Первый аргумент функции operator new должен иметь тип size_t (определенный в файле STDDEF.H), а тип возвращаемых данных — всегда void *.

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

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

// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>

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;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
   Blanks *a5 = new(0xa5) Blanks;
   return a5 != 0;
}

Аргумент, указанный для new в скобках, передается в Blanks::operator new в качестве аргумента chInit. Однако глобальная функция operator new скрыта, из-за чего код (например, показанный ниже) выдает ошибку.

Blanks *SomeBlanks = new Blanks;

В Visual C++ 5.0 и более ранних версиях неклассовые типы и все массивы, выделенные с помощью оператора new, всегда использовали глобальную функцию operator new (независимо от того, были ли они типа class).

Начиная с Visual C++ 5.0, компилятор поддерживает в объявлении класса операторы new и delete массива членов. Например:

// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
   void * operator new[] (size_t)
   {
      return 0;
   }
   void   operator delete[] (void*)
   {
   }
};

int main() 
{
   MyClass *pMyClass = new MyClass[5];
   delete [] pMyClass;
}

См. также

Ссылки

Функция operator delete

Оператор new (C++)

Оператор delete (C++)