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

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

07.03.2015, 19:15. Показов 2156. Ответов 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
13792 / 10984 / 6492
Регистрация: 18.12.2011
Сообщений: 29,285
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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru