Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Невыводимое сообщение про badalloc

07.03.2015, 19:15. Показов 2116. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вылетает с сообщеним std::badalloc.
C++
1
2
3
uint64_t *x=new uint64_t[1000000000000];
        x[-1]=0;
    delete []x;
________________________________________ _
Не вылетает с сообщеним std::badalloc. и завершается успешно
C++
1
2
3
uint64_t *x=new uint64_t[1200000000000];
        x[-1]=0;
    delete []x;
Хотя во втором цифра под выделение на 200 000 000 000 больше.

________________________________________ __
Но при этом вылетает если пробовать обойти весь массив.
C++
1
2
3
4
5
6
7
8
9
10
11
uint64_t *x=new uint64_t[1200000000000];
    uint64_t i=0;
    uint64_t temp=-1;
 
        while (i!=temp-1){
            x[i]=i;
            if (i==temp-1) break;
            else i++;
        }
 
    delete []x;
Может быть растолкуете такие непонятные неоднозначные реагирования.

Всего 8ГБ, 4,40ГБ свободно, Win7x64, gnu gcc
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2015, 19:15
Ответы с готовыми решениями:

И снова про PopupMenu (было про длину, теперь про ширину)
Добавляем в пустое PopupMenu несколько пунктов динамически (шириной, например, до 50 символов). Отображаем его – всё нормально. Затем...

В FireFox при открытии любого сайта всплывает сообщение про недействительный сертификат
Вот оно:

Создать файл с информацией о студентах, вывести сообщение про студентов по возрастанию их балла за сессию
Задание: создать файл, содержащий информацию о студентах: фамилия, инициалы, средний балл за сессию, номер телефона и адрес. Вывести...

32
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.03.2015, 20:50  [ТС]
Студворк — интернет-сервис помощи студентам
да мне непонятно причем тут size_t
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.03.2015, 20:52
Цитата Сообщение от daslex Посмотреть сообщение
да мне непонятно причем тут size_t
new принимает размер выделяемой памяти в size_t
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.03.2015, 20:58  [ТС]
Чего-то здесь не сходится с суждениями.
Ну или я черезчур тупой.(не исключаю)
Миниатюры
Невыводимое сообщение про badalloc   Невыводимое сообщение про badalloc  
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.03.2015, 20:59
daslex, http://en.cppreference.com/w/c... erator_new
1
07.03.2015, 21:12  [ТС]

Не по теме:

Я про size_t понял так, что этот size_t имеет отношение к моему посту с цитатой из Прата. Т.е. ситуация такая, когда константа-таки не довыделяется на столько насколько требуется. Поэтому там мне посоветовали указать соответствующий размер.

Но так подано про size_t, что: "Куда хочешь, туда и относи". Ведь воспринять можно очень по разному. Не хотелось бы некоторого рода "двуличных ответов".

0
Модератор
Эксперт С++
 Аватар для zss
13789 / 10981 / 6492
Регистрация: 18.12.2011
Сообщений: 29,281
07.03.2015, 21:22
А ведь действительно
C++
1
2
3
void *__cdecl operator new(
   size_t count
);
Что стоило посмотреть, что параметр new - переменная типа size_t!!!!!!!!
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.03.2015, 21:39  [ТС]
Убежденный, Хорошо, что Вы меня направляете на путь истинный, благодаря Вам я сейчас что-то еще узнал (причем действительно полезное). Но, Вам не кажется, что мой вопрос имеет отношение немного к другому?

1200000000000 не влазит в size_t твоего компилятора.
В результате переполнения получается 1704124416.

а 1000000000000 влазит что ли?))
_____________________
У меня не вопрос: "Почему ошибка".
У меня вопрос: "Почему в аналогичной ситуации две различные реакции программы".

В одном случае вылет с сообщением о BadAlloc, во втором случае просто вылет
_________
(с тем к чему пришли про size_t)
В одном случае вылет с badalloc
Во втором случае все окей
Ведь судя из возвращаемого значения new должно получаться size_t и в первом и во втором случаях.

Может это кто-то пояснить?

вылет с badalloc
C++
1
2
3
uint64_t *x=new uint64_t[1000000000000];
 
    delete []x;
Успешное завершение программы
C++
1
2
3
uint64_t *x=new uint64_t[1200000000000];
 
    delete []x;
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.03.2015, 22:02
Лучший ответ Сообщение было отмечено daslex как решение

Решение

Цитата Сообщение от daslex Посмотреть сообщение
У меня не вопрос: "Почему ошибка".
У меня вопрос: "Почему в аналогичной ситуации две различные реакции программы".
Попробуем разобраться.

Выражение "type * p = new type[count]" на двоичном уровне так или
иначе приходит к вызову функции выделения памяти размером как минимум
"sizeof (type) * count" байт.

В обоих приведенных случаях значение count, как мы уже выяснили, не
влезает в тип size_t и поэтому "выдает себя за другого". В итоге
1000000000000 превращается в 3567587328, а
1200000000000 превращается в 1704124416.

Дальше происходит еще одно переполнение. А именно: размер uint64_t - 8 байт,
поэтому конструкция "uint64_t * p = new uint64_t[3567587328]" приводит к
попытке выделения 3567587328 * 8 = 2770894848 байт (да-да, такая вот
арифметика). Не знаю, как в других операционках, но в 32-битных процессах
Windows выделить порядка двух гигов непрерывной памяти практически невозможно.
Отсюда и std::bad_alloc в первом примере.

Во втором примере немного по-другому: 1704124416 * 8 = 748093440, меньше
одного гигабайта. Да, много, но система выделить может.
Поэтому здесь std::bad_alloc нет.

Пример для иллюстрации написанного выше (Visual C++ 2008 SP1, Win32):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
 
int main()
{
    using namespace std;
 
    typedef unsigned __int64 uint64_t;
 
    size_t Count1 = (size_t)1000000000000;
    size_t Count2 = (size_t)1200000000000;
 
    cout << "[1] Bytes to allocate = " << Count1 * sizeof (uint64_t) << endl;
    cout << "[2] Bytes to allocate = " << Count2 * sizeof (uint64_t) << endl;
 
    return 0;
}
> [1] Bytes to allocate = 2770894848
> [2] Bytes to allocate = 748093440
2
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.03.2015, 22:04  [ТС]
Вот это я и хотел узнать. Спасибо.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.03.2015, 22:59
Цитата Сообщение от daslex Посмотреть сообщение
castaway, не умею ...
Не понял смысла ответа.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.03.2015, 23:22  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Не понял смысла ответа.
Ну в смысле, что то где я видел написано, что указатель в случае неудачного выделения памяти возвращает NULL (null_ptr)

Сразу же я привожу пример где я пытаюсь это изобразить, но у меня на это ноль реакции. Не получилось - значит не хватает знаний. Не хватает знаний - значит не умею.

C++
1
2
3
4
5
6
uint64_t *x=new uint64_t[1000000000000];
        if (!x){  //Вот тут вроде как должно быть не хватило, возвращаю NULL
            cout<<"error\n";
            return 0;  //И так как не хватило, то сразу выхожу
        }
    delete []x;
Но завершается badalloc

из Прата
Может случиться так, что операция new не сможет найти запрошенный объем
памяти. За первое десятилетие своего существования в C++ такая ситуация
обрабатывалась возвратом нулевого указателя из операции new. Однако в настоящее время new
генерирует исключение std: :bad_alloc.
Для меня это как на гуще гадать. Тут ноль, а тут ловить исключение. Я и исключения-то не понимаю и еще и все вместе "зауниверсалить" не могу.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.03.2015, 23:35
Давай начнём с "чистого листа"...
В чём проблема!?
0
07.03.2015, 23:46  [ТС]

Не по теме:

Тема другая нужна. Это ведь другой вопрос. Если я сам не разберусь, спрошу :) Мне пока что это не нужно.
1 тема - 1 вопрос. :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2015, 23:46

Про ШИМ в роли ЦАП и про АЦП на примере резистивного датчика
Есть датчик угарного газа MICS-5525. Он состоит из чувствительного слоя (пины 1-3, см. вложение), который меняет своё сопротивление в...

Версии Делфи 10 и 7. Можно где-то почитать про их особенности, про совместимость?
Переносили вы проекты из делфи 7 на делфи 10. Может знаете в чем особенности, где можно побольше информации почитать, что может не...

Как заблокировать windwos (нет, я не про вирус, а про win+l)
Возможно такой вопрос уже задавали такой вопрос, но всё же как заблокировать компьютер (вызвать экран блокировки как win+l), а то везде...

моя первая плата, хедеры - вопрос про eagle или про пайку
До сих пор я паял платы на однослойных платах для прототипирования - примерно вот таких http://www.ebay.som/itm/221207693405 Один из...

разное про работу инвертора, трансформатора + про esr
разбирал вчера монитор viewsonic vx2255wmh (поводом стало то, что osd меню работало, а сигнала с компа не было) электролиты надо снова...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru