С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Почему тут UB?

28.02.2020, 08:59. Показов 2973. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Есть такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
typedef struct {
  int a; int b;
} X;
 
int main()
{
  X* x = (X*)malloc(sizeof(X));
  if (!x) return 1;
 
  x->a = 111;
  x->b = 222;
 
  printf("x->a = %d\n", x->a);
  printf("x->a = %d\n", x->b);
 
  free(x);
  return 0;
}
Говорят, что он корректен в С, но в С++ ведет к неопределенному поведению. Почему он корректен в С понятно, но объясните, почему в С++ это UB?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2020, 08:59
Ответы с готовыми решениями:

Почему тут ошибка
Всем привет! Не могу понять, почему возникает ошибка: class Vector { int values; public Vector(int nDim) {

Почему тут разный вывод?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { for(int i = 0, j = 20; i &lt; 20, j &gt; 10; i++, j--) { printf(&quot;%d...

Можете объяснить, почему тут NPE
Добрый день В программировании новичок. Программа, которая должна вывести после сортировки массива индекс элементов до...

40
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,309
28.02.2020, 09:16
Цитата Сообщение от d7d1cd Посмотреть сообщение
Говорят
кто говорит-то?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.02.2020, 09:30
Цитата Сообщение от d7d1cd Посмотреть сообщение
Говорят, что он корректен в С, но в С++ ведет к неопределенному поведению. Почему он корректен в С понятно, но объясните, почему в С++ это UB?
Скорее всего просто паранойя, реакция на функцию malloc
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
28.02.2020, 10:30  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
кто говорит-то?
Ведущий разработчик компании Мера, занимающейся созданием программных продуктов, на недавно проведенном митапе.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Скорее всего просто паранойя, реакция на функцию malloc
Очень сомневаюсь...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.02.2020, 10:35
Цитата Сообщение от d7d1cd Посмотреть сообщение
Очень сомневаюсь...
Не сомневайся, у ведущих разработчиков это часто встречается.
Скорее всего он имел ввиду, что если ты добавишь в структуру X поле с типом std::string, например, либо проинициализируешь a и b, то твой код не будет работать.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
28.02.2020, 10:42  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Скорее всего он имел ввиду, что если ты добавишь в структуру X поле с типом std::string, например, либо проинициализируешь a и b, то твой код не будет работать.
Нет. Не было условия что когда-то что-то добавится. Именно этот код в С++ - UB.
Я с ним связался, он дал ссылку на видео, откуда это он взял. Говорит, что в видео есть ссылка на стандарт. Сам я пока не смотрел.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.02.2020, 10:49
Цитата Сообщение от d7d1cd Посмотреть сообщение
Нет. Не было условия что когда-то что-то добавится. Именно этот код в С++ - UB.
Там вроде про вызов конструктора и говориться, на 24:50.
Если конструктора нет, то без разницы.
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,309
28.02.2020, 11:08
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ведущий разработчик компании Мера,
Ну дык спроси у него - "почему?".
Имей в виду, даже самые-самые ведущие разработчики могут ошибаться, ибо errare humanum est.
0
фрилансер
 Аватар для Алексей1153
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,020
28.02.2020, 11:40
Цитата Сообщение от Verevkin Посмотреть сообщение
могут ошибаться
а иногда они не просто ошибаются, а заблуждаются, искренне веря в то, что они правы и всем это навязывая ))

такие случаи медицине известны

кстати, тут точно ошибка
printf("x->a = %d\n", x->b);
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
28.02.2020, 11:57
Цитата Сообщение от Алексей1153 Посмотреть сообщение
кстати, тут точно ошибка
printf("x->a = %d\n", x->b);
На первый взгляд не вижу. Не считая слегка путающей мелочи, что под видом x->a выдается x->b, но это ж не ошибка.
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,309
28.02.2020, 12:04
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а иногда они не просто ошибаются, а заблуждаются, искренне веря в то, что они правы и всем это навязывая ))
Был у нас в бригаде один такой старый пид... специалист. Постоянно приходилось предоставлять пруфы его неправоты, но ни единого раза он так и не признал, что он не прав. Ушёл на пенсию пару лет назад. Проводили с шампанским и под песню группы "звери".
0
фрилансер
 Аватар для Алексей1153
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,020
28.02.2020, 12:15
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
но это ж не ошибка
по мне - очень даже ошибка )

Verevkin, среди них есть два вида: один признаёт неправоту, если предоставить доказательства. Второй живёт под лозунгом "все люди разные, а я - одинаковый" )
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
28.02.2020, 12:20
Цитата Сообщение от Алексей1153 Посмотреть сообщение
по мне - очень даже ошибка )
видно же, что код тестовый, там можно было хоть "ААА" написать, разницы нет.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
28.02.2020, 12:23  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
идно же, что код тестовый, там можно было хоть "ААА" написать, разницы нет.
Согласен.
Алексей1153, не надо разводить демагогию. Ошибся я, это ж и так понятно. Лучше конкретно по вопросу ответьте: коде есть UB?
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,309
28.02.2020, 12:26
Цитата Сообщение от Алексей1153 Посмотреть сообщение
среди них есть два вида: один признаёт неправоту, если предоставить доказательства. Второй живёт под лозунгом "все люди разные, а я - одинаковый" )
Наш был типа "Все гондурасы, а я дартаньян".
Давил авторитетом и 50-летним стажем работы. Я когда молодой был, тоже поддавался. Но в один прекрасный день мне это надоело и я принял меры.
Кликните здесь для просмотра всего текста


Добавлено через 56 секунд
Цитата Сообщение от d7d1cd Посмотреть сообщение
Лучше конкретно по вопросу ответьте: коде есть UB?
нет. Передай хмырю, что это Я сказал.
0
фрилансер
 Аватар для Алексей1153
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,020
28.02.2020, 12:38
d7d1cd, написано же выше - если класс не POD, то будут неприятности. Так и передай ) Ну и упростить всё это требуется

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct X
{
  int a=0;
  int b=0;
};
 
int main()
{
  X x;
  x.a = 111;
  x.b = 222;
 
  printf("a == %d\n", x.a);
  printf("b == %d\n", x.b);
 
  return 0;
}
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.02.2020, 12:41
Цитата Сообщение от Verevkin Посмотреть сообщение
кто говорит-то?
Уже давно все чуваки из комитета об этом говорят. Я этот сэмпл с мерского митапа видел несколько лет назад, наверное
Цитата Сообщение от d7d1cd Посмотреть сообщение
Почему он корректен в С понятно, но объясните, почему в С++ это UB?
Уже есть proposal для исправления этого. И в нем описаны причины в том числе. Почитай:
P0593R5
Implicit creation of objects for low-level object manipulationl

Хотя я не встречал живьем компилятора, в котором бы это приводило к UB.

Добавлено через 2 минуты
Цитата Сообщение от d7d1cd Посмотреть сообщение
Лучше конкретно по вопросу ответьте: коде есть UB?
Если жить по стандарту, то есть, подходить формально к вопросу, то есть. Если по логике, то для меня - нет
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,309
28.02.2020, 12:41
Цитата Сообщение от Vourhey Посмотреть сообщение
Уже давно все чуваки из комитета об этом говорят. Я этот сэмпл с мерского митапа видел несколько лет назад, наверное
Продолжай...
Кликните здесь для просмотра всего текста
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.02.2020, 12:52
Цитата Сообщение от Verevkin Посмотреть сообщение
Продолжай...
Имеющий глаза да увидит. А слепой сытому не товарищ.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.02.2020, 13:20
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

Цитата Сообщение от d7d1cd Посмотреть сообщение
почему в С++ это UB?
Потому, что malloc не начинает жизнь объекта:
Цитата Сообщение от intro.object/1
An object is created by a definition, by a new-expression, when implicitly changing the active member of a union, or when a temporary object is created.
Но начиная c С++20 это уже не так:
Цитата Сообщение от intro.object/1
The constructs in a C++ program create, destroy, refer to, access, and manipulate objects. An object is created by a definition, by a new-expression, by an operation that implicitly creates objects (see below), when implicitly changing the active member of a union, or when a temporary object is created
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.02.2020, 13:20
Помогаю со студенческими работами здесь

Почему тут нужен амперсанд (&) ?
Вопрос по foreach , а точнее, по амперсанду (&amp;) в foreach: Есть цикл: $nums = ; foreach($nums as $v) $v = $v * 10; ...

Почему не записывает в textbox? В чем тут ошибка?
private void button3_Click(object sender, EventArgs e) { string strSQL; using (cn = new...

Не могу понять почему не работает и где тут ошибка
Доброго всем времени суток! Нужна ваша помощь скачал с инета форму которая определяет сколько людей онлайн на сайте установил по...

Гибридное видео в ноутах... почему у многих тут проблемы???
Железо: ноут Samsung NP-R730 (JB02RU) это если верить заводской наклейке по инфе но офсайте в этой конкретной конфигурации встоит только...

Где тут ошибка и почему, ну ни как не могу разобраться
/* Программа: Параметры vararg и перегрузка. */ class VarArgs3 { static void vaTest(int ... v) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru