Я обнаружил, что компилятор 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()
)?
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
«, но я опустил это для ясности.
От имени компилятора (uC) я предполагаю, что это для встроенного контроллера. Это имело бы смысл, поскольку вам редко требуется динамическое управление памятью со встроенными устройствами, но может быть полезно использование «C с классами». Надеюсь, он поддерживает «размещение новых», так что вы можете использовать C ++.
Если ваш компилятор не поддерживает новые & удалить, это на самом деле не так уж много компилятора C ++!
Я думаю, что ключевое слово «новый» эффективно конвертируется в:
Object* pointer = (Object *)new(sizeof Object);
pointer->Object_Constructor(args);