понял, что по новым стандартам здесь уб? и даже extern "C" не помогает?
Почему?
А где тут UB?
Кажется, начиная с C++20 как раз уб нет, malloc неявно создает нужные объекты
потому что "lifetime объектов начинается с вызова конструктора, new или placement new"
новые стандарты наоборот добавляют послабления
при том что malloc сишная функция и никаких кнструкторов она не вызывает
Не понял, ну выделили мы 1000 байт. И чего? Причем тут?
В предыдущих версиях стандарта в момент mem[12] = 'c' было (вроде как) уб, обращение к несуществующему объекту
лайфтайм некоторых типов она начинать умеет (ну почти). новые стандарты добавляют новые правила, чтобы 1) так умели больше функций 2) они умели это для большего кол-ва типов
Не было. Я уж перепугался, что в последних чего безуного наворотили.
тоесть malloc будет их занулять?
Что он будет занулять? С какого бодуна?
Первый раз об этом слышу. Странно. Мы выделили память в куче. Время жизни типа указателя - автоматическое (до конца функции), время жизни 1000 байт - динамическое ( до конца программы, если не убрать самому). Где тут UB я так и не понял.
Указателя — да. А памяти по нему — не началось.
Интересно, а где ты тут собрался впилить extern "C" ?
Тут наверное намёк на начало времени жизни, так наоборот, по новым стандартам тут НЕ UB, а по старым - да.
extern "C" не про это говорит
А где в этом коде хоть один объект ?
char *mem = (char *)malloc(1000); mem - объект
mem, если натягивать сову на глобус
Там их полно. 1003 на вскидку вижу.
Да не надо ничего натягивать, mem настоящий объект.
Хотя нет, 3 без placement new.
По сути да, по терминологии нет.
Ещё литерал rvalue.
А это не объект
По терминологии да. Не являются объектами только ссылки и функции.
Хотя, могу ошибаться, это очень тонкие нюансы
Вроде объект, но лезть в cppref лень.
Во, значит я ошиблася в теории.
Обсуждают сегодня