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

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

07.03.2015, 19:15. Показов 2222. Ответов 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
13799 / 10990 / 6493
Регистрация: 18.12.2011
Сообщений: 29,291
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
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru