Вот это лобец......
Что делается, когда компилятор видит ключевое слово new? Сначала выделяется память, и компилятор получает указатель на нее, потом вызывается конструктор; ясно, что где-то в глубине кода конструктор получает указатель на свежую, сырую память, исполняет себя, а потом возвращает указатель обратно клиенту. Как выделяется сырая память? На то есть оператор operator new.
Вот его прототип:
Код:
void* operator new(size_t);
Ничего сложного. Несколько необычно получает параметр, правда, но это только на первый взгляд, на то он и оператор. Параметр - это размер объекта; похоже на то, как если бы мы написали (но неверно разумеется):
Код:
CClass* cc = operator new(sizeof(CClass));
Зато мы можем перегрузить operator new (что не удивительно), да к тому же добавить параметров (что уже лучше). Главное, чтобы первый параметр был все равно size_t - размер объекта, а то из спецификаци языка вылетим. Обратите внимание - перегружается оператор operator new(), а не ключевое слово new, оно же элемент синтаксиса, можно сказать. Прототип перегрузки и пример использования:
Код:
void* operator new(size_t int);
// V
// -----<----
// ¦
// V
CClass* cc = new(234) CClass;
У меня ни малейшего понятия, зачем Вы суете сюда int. Лично у меня на параметр свои виды. Я собираюсь пульнуть туда как раз тот указатель, который надо вернуть. А больше ничего не делать. Чтоб память НЕ ВЫДЕЛЯЛАСЬ. Потому что я намереваюсь ее раздобыть сам.
Код:
// Прототип оператора
void* operator new(size_t, void* buffer) {return buffer};
// Использование. Получаем шмат памяти
char* piece_of_memory[1000000000000];
// делаем вызов.
CClass* cc = new(piece_of_memory) CClass;
Мрачная картина. Душераздирающее зрелище. Но результат на лице: Это - менеджер памяти. Самый натуральный. Буферизованный оператор operator new. Виртуальный конструктор (не знаю почему; учитывая, что в официальных справочниках Microsoft разъясняется, что СИСТЕМНЫЙ диск это тот, с которого ЗАГРУЖАЕМСЯ, а ЗАГРУЗОЧНЫЙ тот, на котором СИСТЕМА.