Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 19.02.2023
Сообщений: 44

Баг с++ или что это?

27.02.2023, 22:19. Показов 561. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<iostream>
using namespace std;
 
void FillArray(int* const arr, const int size)
{
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 20;
    }
}
 
void PrintArray(const int* const arr, const int size) 
{
    for (int i = 0; i < size; i++)
    {
        cout << *(arr + i) << "\t";
    }
    cout << endl;
}
 
void Copy(int* arr1,int* arr2,const int size)
{
    delete[] arr1;
 
    arr1 = new int[size];
 
    for (int i = 0; i < size; i++)
    {
        *(arr1 + i) = *(arr2 + i);
    }
}
 
int main()
{
    srand(time(NULL));
    int* arr1 = new int[5];
    int* arr2 = new int[10];
 
    FillArray(arr1, 5);
    FillArray(arr2, 10);
 
    cout << "First array: " << endl;
    PrintArray(arr1, 5);
 
    cout << "Second array: " << endl;
    PrintArray(arr2, 10);
 
    Copy(arr1, arr2, 10);
 
    cout << "First array: " << endl;
    PrintArray(arr1, 10);
 
    cout << "Second array: " << endl;
    PrintArray(arr2, 10);
 
    delete[] arr1;
    delete[] arr2;
 
    arr1 = nullptr;
    arr2 = nullptr;
 
}
В строчке где вызов функции Copy() я передаю первым параметром адрес на нулевой элемент динамического массива, потом в непосредственно в функции копирую второй массив в первый, но по идее этот код не рабочий, потому что когда в функции я использую new int меняется адрес указателя именно который в функции, а указатель в мейне так и остается неизменным и содержит мусор. Но почему этот код все равно выводит два одинаковых массива 3 из 5 раза, а остальные два раза выводит ошибку(как и должен) и выводит мусор.Будто бы есть большой шанс что во время вызова new int присвоится такой же адрес как до этого, только выделится больше памяти. Либо я чего то не замечаю либо чего то не знаю, прошу помочь

P.S. если что я знаю, что чтобы код был рабочий я должен передать ссылку на указатель, вопрос в другом
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.02.2023, 22:19
Ответы с готовыми решениями:

std::regex : баг на сайте или баг компилятора?
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

баг или что-то другое?
вот код: enum SexType {female, male}; struct PersonStruct { char name; int age; SexType sex; }; void...

Это баг или я что-то не понимаю ?
Есть такой код; text = 'https://vk.com/id125078' print(text) ВЫВОД: id12507 Вопрос: почему не вывелась последняя...

9
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
27.02.2023, 22:23
Цитата Сообщение от senv1s Посмотреть сообщение
по идее этот код не рабочий, потому что когда в функции я использую new int меняется адрес указателя именно который в функции, а указатель в мейне так и остается неизменным и содержит мусор.
Верно.

Цитата Сообщение от senv1s Посмотреть сообщение
Но почему этот код все равно выводит два одинаковых массива 3 из 5 раза, а остальные два раза выводит ошибку(как и должен) и выводит мусор.
Это называется "неопределенное поведение". После освобождения памяти указатель в main становится бессмысленным. Доступ через такой указатель приводит к неопределенному поведению. У неопределенного поведения нет никакого "почему". Неопределенное поведение непредсказуемо. Может произойти что угодно.
0
0 / 0 / 0
Регистрация: 19.02.2023
Сообщений: 44
27.02.2023, 22:29  [ТС]
Максимально странно.
Я прошу вывести что находится по адресу А, а мне выводит Б, такое только на плюсах? Это из за высокого уровня абстракции или что? Надо будет изучить это неопределенное поведение. Уже второй раз из за него захожу в тупик
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
27.02.2023, 22:35
Цитата Сообщение от senv1s Посмотреть сообщение
Я прошу вывести что находится по адресу А, а мне выводит Б, такое только на плюсах?
Ничего подобного, разумеется, не происходит. На практике все выводится по тем адресам, по которым вы "попросили". О каком "находится по адресу А, а мне выводит Б" вы ведете речь - не ясно. (Приведите пример конкретного вывода.)

Но с точки зрения языка C++ никакого "прошу вывести что находится по адресу А" тут нет. Никто вам в С++ не разрешал ничего "просить" по невалидному адресу. Вам лишь кажется, что вы "просили вывести что находится по адресу А". А на самом деле никакого "A" в природе вообще не существует.
1
0 / 0 / 0
Регистрация: 19.02.2023
Сообщений: 44
27.02.2023, 22:43  [ТС]
Ну вот в этой же программе где я второй раз вызываю
C++
1
PrintArray(arr1, 10);
и передаю указатель с мусором, а мне выводит все, что находится по другому адресу либо же выводит мусор и выдает ошибку как и должно
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
27.02.2023, 22:45
Цитата Сообщение от senv1s Посмотреть сообщение
а мне выводит все, что находится по другому адресу
По какому "другому адресу"?

Вполне может быть, что внутри функции Copy новый массив выделился по тому же адресу, по которому сидел старый. Так совпало...
1
0 / 0 / 0
Регистрация: 19.02.2023
Сообщений: 44
27.02.2023, 22:54  [ТС]
Да, я об этом тоже подумал, но каков шанс? Или так задумано? Но не всегда же выделяется по тому же адресу или это и есть неопределенное поведение?

Добавлено через 4 минуты
Но что я заметил, так это если проходиться по коду отладчиком visual studio, то все работает как должно, всегда
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.02.2023, 22:57
senv1s, работающая ожидаемым образом программа - это частный случай неопределенного поведения.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
27.02.2023, 22:59
Лучший ответ Сообщение было отмечено senv1s как решение

Решение

Цитата Сообщение от senv1s Посмотреть сообщение
Да, я об этом тоже подумал, но каков шанс?
Во-первых, я бы предположил, что принцип LIFO может играть существенную роль в механизмах управления динамической памятью: если память была только что освобождена, то весьма велика вероятность, что следующий запрос на выделение памяти сначала попытается выделить память по этому же самому адресу (если размеры позволяют).

Во-вторых, в современном С++ управление сырой динамической памятью уже проникает в ядро языка, т.е. не является чисто библиотечной функциональностью. Запросто можно ожидать что скоро (или уже) попытки не делать ненужные освобождения/выделения будут оптимизироваться на уровне компилятора.

Цитата Сообщение от senv1s Посмотреть сообщение
Но что я заметил, так это если проходиться по коду отладчиком visual studio, то все работает как должно, всегда
Ничего удивительного в этом нет. В дебажном режиме все работает сильно по-другому. В том числе в вопросах динамической памяти.

Еще раз: вы занимаетесь экспериментами с неопределенным поведением. Это довольно бессмысленное занятие.
1
0 / 0 / 0
Регистрация: 19.02.2023
Сообщений: 44
27.02.2023, 23:09  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
если память была только что освобождена, то весьма велика вероятность, что следующий запрос на выделение памяти сначала попытается выделить память по этому же самому адресу (если размеры позволяют).
Кстати да, пришла мысль только что, а может в ситуациях когда выделить память по тому же адресу не удается по причине того, что не позволяют размеры(например следующая ячейка памяти занята другой программой), тогда присваивается другой адрес и выводится мусор, а когда места хватает, то тупо присваивается тот же адрес и записывает значения по нему и из за этого все работает 'как надо'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2023, 23:09
Помогаю со студенческими работами здесь

Это баг или фича?
Суть проблемы: есть json, из него берутся имена файлов, и есть функция, которой передается имя файла для загрузки с сервера и сохранения...

Что это за баг с темой?
Прикрепил фото чуть ниже. Такой баг наблюдается на всех темах, кроме стандартной... патчил через UxTheme.

Это похоже на баг студии или компилятора
Проблема в том, что после функции Randomize, массив forcombo = random_for_combo, но я не приравнивал его нигде. Пожалуйста, помогите. ...

Это баг в игре или артефакты полезли в видюхи?
это баг в игре или артефакты полезли в видюхи?

Почему от перемены мест слагаемых (float) сумма меняется? Это что баг?
По неизвестным мне причинам, если просто сложить числа получается одно значение, а вот если разбить сложение на несколько частей типа...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru