Здавалка
Главная | Обратная связь

Некоторые особенности.



1. Параметр размер будет содержать число в байтах, которое необходимо выделить для размещения объекта. Это значение будет сформировано автоматически, т. е. передавать явно его нет необходимости.

2. У параметра размер тип данных size_t. Данный тип - это псевдоним, под которым скрывается unsigned int.

3. В прототипе оператора new можно указать дополнительные параметры, которые будут передаваться при вызове new. При этом - самое главное, чтобы на первом месте в объявлении функции находился параметр типа size_t.

4. Перегруженная функция new должна возвращать указатель на выделенную память.

5. Функция delete получает указатель на область памяти, которую необходимо освободить, при этом, она обязана освободить эту память.

6. В delete также можно передавать дополнительные параметры.

Ну, а теперь, рассмотрим пример:

# include <iostream>using namespace std;// библиотека для функций// выделения памяти#include <malloc.h> class SomeClass{ int some; public: // перегруженные операторы new и delete, // здесь также используются дополнительные // параметры, передаваемые внутрь операторов void * operator new(size_t size,char* str = "New"); void operator delete(void* ptr); // перегруженные операторы new [] и delete [] void * operator new [] (size_t fullsize, char* str = "New []"); void operator delete [] (void* ptr);}; void * SomeClass::operator new( size_t size,char* str){ cout <<"\n"<<str<<"\n"; /* Здесь, для выделения памяти используется стандартная функция void *malloc( size_t size ); В неё передаётся size - количество байт, которое нужно выделить. Если память выделяется, то из malloc возвращается адрес начала выделенного блока. */ void*ptr = malloc(size); if(!ptr){ cout<<"\nError memory new!!!\n"; } else{ cout<<"\nMemory new - OK!!!\n"; } return ptr; }void * SomeClass::operator new[]( size_t fullsize,char* str){ cout <<"\n"<<str<<"\n"; /* Здесь, для выделения памяти используется стандартная функция void *malloc( size_t size ); В неё передаётся size - количество байт, которое нужно выделить. Если память выделяется, то из malloc возвращается адрес начала выделенного блока. */ void*ptr = malloc(fullsize); if(!ptr){ cout<<"\nError memory new[]!!!\n"; } else{ cout<<"\nMemory new[] - OK!!!\n"; } return ptr; } void SomeClass::operator delete( void* ptr){ /* Для очистки памяти используется стандартная функция void free( void * memblock ); Функция free очищает память, memblock - адрес начала очищаемого участка */ free(ptr); cout<<"\nDelete memory\n";} void SomeClass::operator delete[](void* ptr){ free(ptr); cout<<"\nDelete [] memory\n";} void main(){ /* Вызывается оператор new( size_t size,char* str="New") на место size будет подставлен размер класса SomeClass, а str получит значение по умолчанию т.е. "New" */ SomeClass *p = new SomeClass; /* Вызывается оператор new[](size_t size,char* str="New[]") на место size будет подставлен размер класса SomeClass, умноженный на количество запрашиваемых элементов а str получит значение по умолчанию т.е. "New[]" */ SomeClass *r = new SomeClass [3]; /* Вызывается оператор delete(void* ptr) на место ptr будет подставлен адрес памяти, выделенной под объект р */ delete p; /* Вызывается оператор delete[](void* ptr) на место ptr будет подставлен адрес памяти, выделенной под объект r */ delete[]r; } _____________________________________________________ Результат работы программы: New Memory new - OK!!! New [] Memory new[] - OK!!! Delete memory Delete [] memory
Предыдущая Оглавление Следующая
Предыдущая Оглавление Следующая






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.