Ошибка выделения памяти p= new (nothrow) int [i], странный результат...

Автор kol1978, 16 сентября 2024, 06:06:11

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kol1978

При введении числа с количеством знаков больше допустимого, программа выдает бесконечный цикл:
Цитироватьer: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter number: Enter n^C
Можете подсказать почему именно так происходит (вывод "Enter number" - 31 строка) ?  и как это посмотреть - в ассемблере или...чтоб можно было понять ход работы программы при таком "сбое"? прога ниже только в русской локализации:
Цитировать#include <iostream>
#include <new>
#include <limits>       // std::numeric_limits
using namespace std;

int main ()
{
    std::cout << "Минимальное конечное значение: int: " << std::numeric_limits<int>::min() << '\n'; //Минимальное конечное значение.
    std::cout << "Максимальное конечное значение: int: " << std::numeric_limits<int>::max() << '\n'; //Максимальное конечное значение.
    std::cout << "Для целых типов: то же, что min(): int: " << std::numeric_limits<int>::lowest() << '\n';
    std::cout << "Колличество битов: int: " << std::numeric_limits<int>::digits << '\n';
    std::cout << "long int: " << std::numeric_limits<long int>::digits << '\n';
    std::cout << "Количество цифр (в десятичной системе счисления), которые могут быть представлены без изменений для типа int: " << std::numeric_limits<int>::digits10 << '\n';   // максимальное кол-во знаков десятичного числа допустимого для int
    std::cout << "Количество цифр (в десятичной системе счисления), которые могут быть представлены без изменений для типа long long int: " << std::numeric_limits<long long int>::digits10 << '\n';   // максимальное кол-во знаков десятичного числа допустимого для long long int

  int I = 11111111111;  //если ввести это число, это приведёт к ошибке т.к. это число преобразуется в -1773790777 и станет размером массива... - ошибка
    // long long  int I = 9999999999999999999;
    int i,n;             // если число i более 9-ти знаков то результат "непредсказуем" (или предсказуем?), скажем 1111111111 - норм , а вот 9999999999 - вызовет такой же "сбой"
     //long long int i,n; // если использовать long long int то при этом срабатывает nullptr
    int * p;
    cout << " если ввести это число из 11-ти знаков будет ошибка" << I << endl <<":";   //./../main.cpp:17:13: warning: overflow in conversion from 'long int' to 'int' changes value from '11111111111' to '-1773790777' [-Woverflow]
    cin >> i;
    p= new (nothrow) int ;//int[-1773790777]; main.cpp:22: ошибка: Array is too large (18446744071935760839 elements)
    if (p == nullptr)
        cout << "Error memory: достигнут максимальный размер массива - 18446744071935760839 elements";
    else
    {
        for (n=0; n<i; n++)
        {
            cout << "Enter number: ";  //при превышении кол-ва введеных знаков числа  - бесконечно повторяется этот вывод, почему то?
            cin >> p[n];
        }
        cout << "You have entered: ";
        for (n=0; n<i; n++)
            cout << p[n] << ", ";
        delete[] p;
    }
    return 0;
}

Цитировать10:49:35: Запускается: «/usr/bin/make» -j4
g++ -c -pipe -g -std=gnu++1z -Wall -Wextra -fPIC -DQT_QML_DEBUG -I../../../memory -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o main.o ../../main.cpp
../../main.cpp: In function 'int main()':
../../main.cpp:17:11: warning: overflow in conversion from 'long int' to 'int' changes value from '11111111111' to '-1773790777' [-Woverflow]
   17 |   int I = 11111111111;  //если ввести это число, это приведёт к ошибке т.к. это число преобразуется в -1773790777 и станет размером массива... - ошибка
      |           ^~~~~~~~~~~
g++  -o memory main.o     
10:49:35: Процесс «/usr/bin/make» завершился успешно.