HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Главная » Статьи » c++ |
Имеется возможность перегрузить new и delete. Это можно сделать в том случае, если необходимо использовать какой-то особый способ выделения памяти. Например, нужно выделять память и, в случае отсутствия её, создавать дисковый файл, в который можно записывать информацию. Какой бы ни была причина, осуществить такую перегрузку очень просто. Для перегрузки операторов new и delete может использоваться следующий формат: void* operator new(size_t размер){
void operator delete(void* p){
Параметр размер будет содержать число в байтах, которое необходимо выделить для размещения объекта.Это значение будет сформировано автоматически. У параметра размер тип данных size_t. Данный тип - это псевдоним, под которым скрывается unsigned int. В прототипе оператора new можно указать дополнительные параметры, которые будут передаваться при вызове new. Самое главное, чтобы на первом месте в обьявлении функции находился параметр типа size_t. Перегруженная функция new должна возвращать указатель на выделенную память. По отношению к классу перегруженный оператор new будет статической функцией-членом. Функция delete получает указатель на область памяти, которую необходимо освободить. Она обязана освободить эту память. Как в new, так и в delete можно передавать дополнительные параметры. Перегруженный оператор delete - статическая функция класса. Для перегрузки операторов new [] и delete [] может использоваться следующий формат: void* operator new[](size_t размер){
void operator delete[](void* p){
Всё вышесказанное о new и delete верно и по отношению к new [] , delete []. Любая теория всегда должна закрепляться практикой !!! Поэтому давайте рассмотрим пример перегрузки new и delete. В нашем примере будет производиться подсчет динамически созданных объектов класса под названием SomeClass. Исходный код примера можно найти в папке New #include<iostream.h> #include <malloc.h> // Класс для обьектов, которого будет производиться подсчет class SomeClass{ // статическая переменная, счетчик static int counter; public: // Функция, возвращающая текущее значение счетчика static int GetCounter(); public: // перегруженные операторы new и delete, // обратите внимание на дополнительные // параметры передаваемые внутрь операторов void * operator new(size_t size,int val, char* str = "New Operator"); void operator delete(void* ptr); // перегруженные операторы new [] и delete [] void * operator new [] (size_t fullsize, char* str = "New [] "); void operator delete [] (void* ptr); }; int SomeClass::counter = 0; int SomeClass::GetCounter() { return counter; } void * SomeClass::operator new( size_t size,int val,char* str) { cout<<"\n**************\n"; for(int i = 0; i < val; i++) { cout << "\n" << str << "\n"; } cout<<"\n**************\n"; /* Для выделения памяти используется стандартная функция void *malloc( size_t size ); В неё передаётся size - количество байт, которое нужно выделить. Если память выделяется, то из malloc возвращается адрес начала выделенного блока. */ void *ptr = malloc(size); if( ptr != 0 ){ //увеличение счетчика counter++; } return ptr; } void * SomeClass::operator new[]( size_t fullsize,char* str) { cout << "\n" << str << "\n"; void * ptr=malloc(fullsize); if(ptr){ counter += fullsize / sizeof(SomeClass); } return ptr; } void SomeClass::operator delete( void* ptr) { cout<<"\nDelete Operator\n"; counter--; /* Для очистки памяти используется стандартная функция void free( void *memblock ); Функция free очищает память,memblock - адрес начала очищаемого участка */ free(ptr); } void SomeClass::operator delete[]( void* ptr) { cout<<"\nDelete [] Operator\n"; // функция _msize возвращает размер // указанного блока памяти counter -= _msize(ptr) / sizeof(SomeClass); free(ptr); } void main() { /* Вызывается оператор new( size_t size,int val,char* str="New Operator") на место size будет подставлен размер класса SomeClass, 2 попадет в val, а str получит значение по умолчанию т.е. "New Operator" */ SomeClass *p = new(2) SomeClass; SomeClass *r = new(3, "In New Operator") SomeClass; cout << "\nThere are " << p->GetCounter() << " objects created dynamically\n"; // Вызывается delete delete p; delete r; cout << "\nThere are " << SomeClass::GetCounter() << " objects created dynamically\n"; // new [] SomeClass *ar = new("New [] was activated") SomeClass[2]; cout << "\nThere are " << SomeClass::GetCounter() << " objects created dynamically\n"; // delete [] delete [] ar; cout << "\nThere are " << SomeClass::GetCounter() << " objects created dynamically\n"; } | |
Просмотров: 7886 | Рейтинг: 5.0/1 |
Всего комментариев: 0 | |