2013-01-09 2 views
3

Я обнаружил, что C++ компилятор для AVR UCS не поддерживает new и delete операторов, но и то, что есть быстрое решение:Почему эта реализация C++ «нового» оператора работает?

void * operator new(size_t size) 
{ 
    return malloc(size); 
} 

void operator delete(void * ptr) 
{ 
    free(ptr); 
} 

Я предполагаю, что теперь было бы возможно для звонка new ClassName(args);.

Однако я не уверен, как это работает. Например, что на самом деле возвращает size_t? Я думал, что конструкторы ничего не возвращают ...

Может ли быть, что new теперь предполагается использовать по-разному (в сочетании с sizeof())?

+0

не перепутать новый и оператор нового. Да, это немного сложно. оператор, который вы перегружаете, просто выделяет память. Вы можете использовать malloc или специальный пул памяти, и вы можете его украсить, чтобы помочь обнаружить утечку памяти и недействительные удаления и т. Д. – CashCow

+0

Означает ли это, что это вообще не создает экземпляр класса вообще или что? Я немного смущен тем, что вы сказали. – corazza

+0

всегда помните, что новый оператор (который вы можете перегрузить) и новое выражение (которое вы обычно используете для создания новых объектов в коде) - это две разные вещи. – PlasmaHH

ответ

9

new T(args); примерно эквивалентен следующему.

void* storage = operator new(sizeof(T)); // obtain raw storage 
call_constructor<T>(storage, args); // make an object in it 

(Здесь call_constructor предполагается вызвать конструктор & крестик; из T решений storage быть this указателя в пределах этого конструктора.)

operator new части получает требуемый объем сырого хранения, и вызов конструктора - тот, который фактически создает объект, путем вызова конструктора.

Код в вопросе только заменяет часть operator new, то есть извлечение памяти. Как часть sizeof, так и вызов конструктора выполняются автоматически компилятором при использовании new T(args).


& dagger; Язык имеет способ выразить этот вызов прямого конструктора под названием «размещение new», но я пропустил его для ясности.

+0

Я думал, что часть 'operator' была частью оператора, определяющего синтаксис ...Поэтому мне нужно добавить часть 'call_constructor' где-нибудь? – corazza

+0

@Yannbane Нет, что компилятор знает, как это сделать. Я сделал ответ более конкретным в этом вопросе. –

+0

ОК, я только что узнал, что «новое выражение» и «новый оператор» - это две разные вещи, поэтому я решил, что это часть. Благодаря! – corazza

0

Из имени компилятора (uC) я предполагаю, что это встроенный контроллер. Это будет иметь смысл, поскольку вам редко требуется динамическое управление памятью со встроенными устройствами, но может быть полезно для «C с классами». Надеюсь, он поддерживает «размещение нового», поэтому вы можете использовать C++.

Если ваш компилятор не поддерживает новый & delete, на самом деле это не очень большой компилятор C++!

Я думаю, что ключевое слово «новый» эффективно преобразуется в:

Object* pointer = (Object *)new(sizeof Object); 
pointer->Object_Constructor(args); 
Смежные вопросы