память — Почему эта реализация оператора C ++ ‘new’ работает?

Я обнаружил, что компилятор C ++ для AVR UC не поддерживает new а также delete операторы, но также, что есть быстрое решение:

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

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

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

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

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

3

Решение

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 part получает запрашиваемое количество необработанного хранилища, а вызов конструктора — тот, который фактически создает объект, вызывая конструктор.

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


† В языке есть способ выразить этот прямой вызов конструктора, который называется «размещение». new«, но я опустил это для ясности.

9

Другие решения

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

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

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

Object* pointer = (Object *)new(sizeof Object);
pointer->Object_Constructor(args);
0

По вопросам рекламы [email protected]