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

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

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

Author24 — интернет-сервис помощи студентам
Вылетает с сообщеним 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2015, 19:15
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

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

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

0
Модератор
Эксперт С++
13706 / 10909 / 6473
Регистрация: 18.12.2011
Сообщений: 29,125
07.03.2015, 21:22 26
А ведь действительно
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  [ТС] 27
Убежденный, Хорошо, что Вы меня направляете на путь истинный, благодаря Вам я сейчас что-то еще узнал (причем действительно полезное). Но, Вам не кажется, что мой вопрос имеет отношение немного к другому?

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
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
07.03.2015, 22:02 28
Лучший ответ Сообщение было отмечено 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  [ТС] 29
Вот это я и хотел узнать. Спасибо.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.03.2015, 22:59 30
Цитата Сообщение от daslex Посмотреть сообщение
castaway, не умею ...
Не понял смысла ответа.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.03.2015, 23:22  [ТС] 31
Цитата Сообщение от 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,169
Записей в блоге: 10
07.03.2015, 23:35 32
Давай начнём с "чистого листа"...
В чём проблема!?
0
daslex
07.03.2015, 23:46  [ТС]     Невыводимое сообщение про badalloc
  #33

Не по теме:

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

0
07.03.2015, 23:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2015, 23:46
Помогаю со студенческими работами здесь

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

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

моя первая плата, хедеры - вопрос про eagle или про пайку
До сих пор я паял платы на однослойных платах для прототипирования - примерно вот таких...

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

Вопрос про обратную связь, и про схемотехнику полумоста
Добрый день) Я сейчас делаю схему от уважаемого rost c форума http://www.psb-kots.ru/forum/ , и...

Про прицелы. Или про линзу сложной формы
Занимаюсь стрельбой из блочного лука. В нем есть прицельное приспособление - на тетиве закреплена...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru