27:33 были выбраны версии delete(void* ptr), delete[](void* ptr) без size_t. Правила выбора довольно неочевидны, поэтому если знание о размере не нужны, то достаточно переопределить только варианты без size_t, так как дефолтные варианты не используют size_t. Глубоко не разбирался но на g++ для неполиморфных типов удаление T* передает в delete size = sizeof(T), а для полиморфных типов (и типов в которых используется виртуальное наследование) передает правильный размер, беря его из rtti.
6:16 Новая тема: Аллокаторы 8:13 Зачем нужна перегрузка new delete (пример Записей выделения и освобождения памяти)... 01:01:20 - 01:13:00 Аллокаторы (высокоуровневая надстройка - класс над delete (free in C) and new (malloc in C) ) 01:14:00 Устройство стандартного Аллокатора 01:23:00 new не конструирует объект, конструктор объекта вызывается через allocator::construct 01:29:00 Переписать свой Вектор уже без new а c allocator
Я что то сомневаюсь, что автор прав при объяснении того как и почему new так работает. Я думаю скорее так - есть дефолтный new, к у которого куча разных перегрузок, так, когда мы пишем auto p = new int[10], то auto определяется как INT*, а не void*, что означает, что существует template T* operator new(size_t N, Args ... args), который в свою очередь работает как вызов других перегрузок оператора new, например : new (malloc(sizeof(T)*N) (args ...) , то есть вызов placement new в адрес (выделяем память), передаём аргументы конструктора. А та перегрузка new в свою очередь просто вызывает конструктор объекта в нужном месте. new[] делаёт в цикле кучу вызовов placement_new, после выделения памяти, вот собственно и всё. А то автор прямо тумана нагнал на это, будто там магия происходит совершенная и вообще хз что.
1) gcc: 'operator new' must return type 'void*' 2) stackoverflow.com/questions/8962467/why-is-the-new-operator-allowed-to-return-void-to-every-pointer-type : "The 'new' operator is not a function and not a function call. It's a separate language construct. It takes raw memory (normally, one returned by the void* operator new(size_t) function) and turns it into an object by calling a constructor. It then returns a properly typed pointer to the newly-created object."
на 1:26:00 вопрос про переменное количество аргументов тоже считаю как то неправильно раскрыт. Не просто "мы такие высокоуровневые, а там какая то сишка", а разница принципиальная - либо мы всегда имеем одну и ту же сигнатуру функции и принимаем условно говоря указатель на массив аргументов, завершающийся специальным нулевым аргументом ,а потом в рантайме что то с ними делаем и куда то в циклах раскидываем с помощью макросов, либо же мы на этапе компиляции делаем с помощью компилятора именно другую сигнатуру - как и должно это быть, ведь у нас может быть 4 аргумента, а может быть 5 и мы такую функцию и создаём и используем её в рантайме уже готовую. И да, конечно, аргументы шаблона переданные как const Args& это тот ещё пиздец.
Предлагаете передавать аргументы шаблона как (Args... args)? Тогда вы не сможете передать константые или некопируемые объекты. Perfect forwarding в 29 лекции