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

Почему тут UB?

28.02.2020, 08:59. Показов 2963. Ответов 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
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,270
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
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,270
28.02.2020, 11:08
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ведущий разработчик компании Мера,
Ну дык спроси у него - "почему?".
Имей в виду, даже самые-самые ведущие разработчики могут ошибаться, ибо errare humanum est.
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,005
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
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,270
28.02.2020, 12:04
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а иногда они не просто ошибаются, а заблуждаются, искренне веря в то, что они правы и всем это навязывая ))
Был у нас в бригаде один такой старый пид... специалист. Постоянно приходилось предоставлять пруфы его неправоты, но ни единого раза он так и не признал, что он не прав. Ушёл на пенсию пару лет назад. Проводили с шампанским и под песню группы "звери".
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,005
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
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,270
28.02.2020, 12:26
Цитата Сообщение от Алексей1153 Посмотреть сообщение
среди них есть два вида: один признаёт неправоту, если предоставить доказательства. Второй живёт под лозунгом "все люди разные, а я - одинаковый" )
Наш был типа "Все гондурасы, а я дартаньян".
Давил авторитетом и 50-летним стажем работы. Я когда молодой был, тоже поддавался. Но в один прекрасный день мне это надоело и я принял меры.
Кликните здесь для просмотра всего текста


Добавлено через 56 секунд
Цитата Сообщение от d7d1cd Посмотреть сообщение
Лучше конкретно по вопросу ответьте: коде есть UB?
нет. Передай хмырю, что это Я сказал.
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,005
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
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,270
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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru