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

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

27.02.2023, 22:19. Показов 604. Ответов 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
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,258
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
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,258
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
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,258
27.02.2023, 22:45
Цитата Сообщение от senv1s Посмотреть сообщение
а мне выводит все, что находится по другому адресу
По какому "другому адресу"?

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

Добавлено через 4 минуты
Но что я заметил, так это если проходиться по коду отладчиком visual studio, то все работает как должно, всегда
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
27.02.2023, 22:57
senv1s, работающая ожидаемым образом программа - это частный случай неопределенного поведения.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,258
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
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru