170 похожих чатов

Привет. Есть : struct X{ void virtual m() { ...

}; };
struct Y: X{ void virtual m() { ... }; };
static_assert(sizeof(X) == sizeof(Y));

X x[2];
auto ptr = reinterpret_cast<char *>(&x[0]);
new(ptr)Y();
когда делаю x[0].m(), ругается санитайзер, хотя всё работает ОК.

member call on address 0x7fffc2422cb8 which does not point to an object of type ...

Подскажите, тут ub? Что можно сделать, чтобы не ругался? Спасибо.

15 ответов

34 просмотра

чтобы не ругалось можно не писать такой код например

basiliscos- Автор вопроса
Denis P
чтобы не ругалось можно не писать такой код наприм...

мне байтики надо экономить. Ещё варианты есть?

Создаётся объект поверх существующего и не удаленного, как минимум

basiliscos- Автор вопроса

а какой санитайзер ругается?

Так нельзя, да. Время жизни x (двух элементов) не завершено.

basiliscos
ок, удалить можно. Это решит проблему?

Стоит попробовать. Правда, когда массив будет удаляться, он вызовет не тот деструктор и всё сломается. И вообще для примера тут массив не нужен.

Отмывать нужно обязательно, поскольку правило для transparently-replaceable нарушается. Если деструктор X будет нетривиальным - все взорвется в нескольких местах (1, 2).

А интересно std::any реализовать с фиксированным внутренним буффером под объект может лучше будет 🤔

Он же тут просто метод X вызовет в любом случае нет?

Sergey Anisimov
Нет (1, 2).

В оригинальном коде с ub, точного ответа нет. Например кажется может сработать девиртуализация, которая проигнорирует vtbl.

magras
В оригинальном коде с ub, точного ответа нет. Напр...

Вероятно. Я про конечный (предположительно корректный) вариант)

struct X{ void virtual m() { ... }; }; struct Y: X{ void virtual m() { ... }; }; static_assert(sizeof(X) == sizeof(Y)); alignof(X) std::byte storage[sizeof(X) * 2]; auto y = new(&storage[0]) Y(); auto x = new(&storage[0] + sizeof(X)) X(); А вот так подойдёт?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта