Перегрузка операторов new и delete.

Рубрика: C++, Дата: 20 April, 2013, Автор:

Здорова господа!

Опять я в замешательстве не знаю как мне перегрузить операторы new и delete. Я вам сейчас здесь попытаюсь подробнейшим образом растолковать.

Ну что ж я начну с описания. Для начала рассмотрим перегрузку new. Как его нужно перегружать какой функцией? Все оказалось просто new перегружается функцией void* operator new(size_t); Обязательно должен принимать параметр первый size_t Это размер объекта в байтах который нужно создать как бы он сам генерируется. Он для того создается, чтобы затем можно было в самой функции operator new() вызвать функцию malloc() языка Си, которая выделяет память.

Посмотреть, что такое указатель на тип void* можно по ссылке: указатель void*.

Теперь разберем как нужно перегружать delete . Для перегрузки delete вызывается функция void* operator delete(void* ) первым параметром которой является указатель на тип void* (обязательный первый параметр). Ну а в самой функции мы просто вызываем функцию языка Си free() и передаем ей этот указатель, она как бы высвобождает память.

Сейчас я вам приведу простой примерчик кода:

//peregryzka operator new()
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::malloc;

class A
{
	int b;
public:
	//peregryjaem new
	void* operator new(size_t size)
	{
		cout <<"size= "<<size<<" bytes"<<endl;
		return malloc(size);//vudel9et pam9t6 po razmery
	}
	
	//peregryzka delete
	void operator delete(void* p)
	{
		cout <<"vucvobojdenie pam9ti"<<endl;
		free(p);//fynkci9 iz Ci vucvobojdaet pam9t6
	}
};

int main()
{
	//vuzuvaetc9 global6nue
	int* number= new(int);
	delete number;
	
	//vuzuvayutc9 pereopredelennue
	A* ptr = new(A); //doljna vuzvatc9 nawa pereopredelenna9 fynkci9
	delete ptr;//vuzuvaetc9 nawa pereobredelenna9 fynkci9 dl9 klacca A
	
	return 0;
}

В коде видно, что операторы new и delete мы перегрузили для класса A и они вызываются только для выделения памяти для этого класса. Для всех остальных вызывается глобальный new и delete.

[youtube]http://www.youtube.com/watch?v=xoFJcT9Itew[/youtube]

rss