С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.04.2021
Сообщений: 36

Abort() has been called. Почему?

27.11.2021, 12:24. Показов 1353. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой код. Я изменяю размер массива на каждой итерации 10i, i=[0, 9]. У меня всё отрабатывает с 0 по 8, но на 9 итерации выдаёт ошибку abort() has been calles. Почему?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int* recreateArr(int* arr, int size)
{
    delete[] arr;
    return new int[size];
}   
 
 
 
 
int main()
{
    int* a = NULL;
    int sz = 0;
    for (int i = 0; i <= 9; i++)
    {
        sz = pow(10, i);
 
        recreateArr(a, sz);
        // fillArr(a, sz);
        
 
        cout << "10^" << i << "\t" << sz << endl;
        cout << endl << endl;
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2021, 12:24
Ответы с готовыми решениями:

R6010 -abort() has been called
Есть код: task_for_thread: void task_for_thread(const size_t idThread) { while (done.value == 1) {} // пусть крутятся тут...

Вылетает : R6010 - abort() has been called
Написал программу которая перемножает 2 очень больших матрицы. На мелких она работает. То есть 10000 на 10000 умножает без проблем. ...

Проблема чтения файла С++ abort() has been called
Здравствуйте. Ранее без проблем считывал данные с файлов в С++, а вчера появилась проблема. Попробовал скомпилировать небольшой код, узнать...

16
фрилансер
 Аватар для Алексей1153
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,008
27.11.2021, 12:38
Kirill994,
C++
1
a=recreateArr(a, sz);
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.11.2021, 12:38
Слишком большой блок, наверное. У тебя приложение 64-бита?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
27.11.2021, 12:47
Цитата Сообщение от Kirill994 Посмотреть сообщение
abort() has been calles. Почему?
Было выброшено исключение, а вы его не отловили.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.11.2021, 13:07
Kirill994, delete [] somePtrToTypeName и new TypeName [] применяются только парами. В вашем случае вы вначале имеете указатель где вы не попросили OS выделить массив. Но вы пытаетесь удалить массив.
На этом указателе можно вызвать delete, но delete[] это ошибка. Вы создали:
C++
1
int* a = NULL;
и пытаетесь удалить:
C++
1
 delete[] arr
в первой итерации.
0
0 / 0 / 0
Регистрация: 27.04.2021
Сообщений: 36
27.11.2021, 13:12  [ТС]
Допустим. как это решает проблему на 9й итерации?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.11.2021, 14:21
Ну и размер в 1000000000 по 4 байта системе тоже не нравится. В чарах 10^9 катит, в целых - нет. Замените <= на < или 9 на 8. Это работает)
Если чуть точнее то zayats80888, обрисовал картину. Исключение:
C++
1
std::bad_array_new_length
если читать вот тут:
https://en.cppreference.com/w/... new_length
то я бы предположил, что имеет место:
2) total size of the new array would exceed implementation-defined maximum value
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.11.2021, 15:00
Цитата Сообщение от IGPIGP Посмотреть сообщение
размер в 1000000000 по 4 байта системе тоже не нравится
это всё-таки зависит от системы.
если система виртуальную память поддерживает, то можно хоть терабайты просить.
вот если попытаться использовать, то другое дело.

что-то мне подсказывает, что ТС не весь код нам показал.
или запускает на какой-то экзотической системе.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
27.11.2021, 15:28
Цитата Сообщение от GbaLog- Посмотреть сообщение
запускает на какой-то экзотической системе
Если считать 32 бита экзотикой, то да
Просто в этом случае, скорее всего, максимальный размер для массива T будет std::numeric_limits<ptrdiff_t>::max() / sizeof(T) (но это implementation specific). У ТС это будет 536870911, что меньше 109

Вот тут более подробно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
27.11.2021, 15:41
Цитата Сообщение от IGPIGP Посмотреть сообщение
delete [] somePtrToTypeName и new TypeName [] применяются только парами. В вашем случае вы вначале имеете указатель где вы не попросили OS выделить массив. Но вы пытаетесь удалить массив.
На этом указателе можно вызвать delete, но delete[] это ошибка. Вы создали:
C++
1
int* a = NULL;
и пытаетесь удалить:
C++
1
 delete[] arr
в первой итерации.
Откуда вы берете все это? О_о

С каких это пор delete [] стало нельзя применять к нулевому указателю?

Это явно не заблуждение, а специально, намеренно ввдумываемая на ровном месте белиберда.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.11.2021, 16:25
Цитата Сообщение от GbaLog- Посмотреть сообщение
это всё-таки зависит от системы.
Я же не сказал чего-то иного, GbaLog-. И ссылка говорит о
Цитата Сообщение от IGPIGP Посмотреть сообщение
implementation-defined maximum value
Добавлено через 7 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это явно не заблуждение, а специально, намеренно ввдумываемая на ровном месте белиберда.
Ну это конспирология с нездоровым складом мышления. Я может быть и согласился бы с тем, что нулевой указатель на целое и нулевой указатель на массив целых во внутреннем представлении это один и тот же тип (из-за того что в С не видели разницы), но если уж delete и new как и delete[] и new[], должны жить парами, то возникает пикантная ситуация как и в парадоксе Кантора. Мат-идиотизм (логически) налицо. Это - моё личное мнение и оно ни как не зависит от того, легально ли (формально) использовать delete[] на нулевом указателе. Впрочем, тема-то уже далеко от того места, где я заметил то о чём вы решили написать столь болезненно (с символами o_O).
0
0 / 0 / 0
Регистрация: 27.04.2021
Сообщений: 36
27.11.2021, 18:27  [ТС]
У меня 64-бит система.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
27.11.2021, 18:30
Цитата Сообщение от Kirill994 Посмотреть сообщение
У меня 64-бит система.
Во-первых, это ни о чем не говорит. Тут важна "целевая разрядность" собираемого исполняемого файла.
Во-вторых, вы так и не предоставили информацию о выброшенном исключении.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.11.2021, 23:06
Цитата Сообщение от Kirill994 Посмотреть сообщение
Почему?
слишком большой кусок памяти запрашиваешь.

Code
1
2
3
4
5
6
7
8
9
1337105581/source.cpp: In function ‘int main()’:
1337105581/source.cpp:21:17: warning: conversion to ‘int’ from ‘__gnu_cxx::__promote_2<int, int, double, double>::__type {aka double}’ may alter its value [-Wfloat-conversion]
         sz = pow(10, i);
              ~~~^~~~~~~
Error(s):
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
 
Abort signal from abort(3) (SIGABRT)
Добавлено через 3 минуты
Цитата Сообщение от GbaLog- Посмотреть сообщение
запускает на какой-то экзотической системе
https://rextester.com/GFSW56684

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cmath>
#include <iostream>
using namespace std;
 
int* recreateArr(int* arr, int size)
{
    delete[] arr;
    return new int[size];
}   
 
int main()
{
    int sz = 0;    
    int* a = NULL;
    for (int i = 0; i <= 9; i++)
    {
        sz = pow(10, i);
        cout << "10^" << i << "\t" << sz << endl;
        recreateArr(a, sz);
    }
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Warning(s):
343133517/source.cpp: In function ‘int main()’:
343133517/source.cpp:18:17: warning: conversion to ‘int’ from ‘__gnu_cxx::__promote_2<int, int, double, double>::__type {aka double}’ may alter its value [-Wfloat-conversion]
         sz = pow(10, i);
              ~~~^~~~~~~
Error(s):
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
 
Abort signal from abort(3) (SIGABRT)
10^0    1
10^1    10
10^2    100
10^3    1000
10^4    10000
10^5    100000
10^6    1000000
10^7    10000000
10^8    100000000
10^9    1000000000
Добавлено через 44 секунды
Цитата Сообщение от IGPIGP Посмотреть сообщение
В вашем случае вы вначале имеете указатель где вы не попросили OS выделить массив. Но вы пытаетесь удалить массив.
На этом указателе можно вызвать delete, но delete[] это ошибка.
нет там никакой ошибки.
нулевой указатель можно делетить как угодно,
по факту никакого удаления все равно не будет.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.11.2021, 23:30
Цитата Сообщение от hoggy Посмотреть сообщение
нет там никакой ошибки.
нулевой указатель можно делетить как угодно,
по факту никакого удаления все равно не будет.
Согласен, - не подумал.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
28.11.2021, 07:55
Цитата Сообщение от hoggy Посмотреть сообщение
https://rextester.com/GFSW56684
ok.
может он ulimit -v выставил себе.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
28.11.2021, 13:26
Цитата Сообщение от GbaLog- Посмотреть сообщение
это всё-таки зависит от системы.
если система виртуальную память поддерживает, то можно хоть терабайты просить.
Когда вы просите терабайты через россыпь блоков меньшего размера - это одно. Когда же вы просите их одним блоком - это другое. Сразу возникает масса нюансов.

Во-первых, популярные 64-битные аппаратные платформы на самом деле не являются полноценно 64-битными на аппаратном уровне. Они искусственно ограничивают ширину виртуального адреса, например, 48 битами.

Во-вторых, соображения ограничения максимального размера непрерывного блока выделяемой памяти, вытекающие из нюансов стандартов С и С++ я разъяснял здесь: Беззнаковый тип size_t: чем различие между size_t, uintptr_t, ptrdiff_t и intptr_t?

В-третьих, реализации могут руководствоваться какими-то дополнительными практическими соображениями для ограничения размера непрерывного блока. Такой размер может быть запросто ограничен 32 битами даже на 64-ной платформе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2021, 13:26
Помогаю со студенческими работами здесь

Debug Error! R6010 - abort() has been called
Помогите исправить ошибку #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(int argc, char * argv) { ...

Abort() has been called - Ошибка в работе программы
Только начал изучать C++. Нужно немного помощи. Задача такова, ввести текст(строку), отсортировать слова в порядке увеличения их длины и...

Abort has been called при создании потока
С помощью CreateRemoteThread запускаю новый поток, в котором примерно следующее: _mainLoop = std::thread(() { for (;;) { ...

Шифр Цезаря: программа выдает "abort() has been called"
#include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;string.h&gt; using namespace std; int main() ...

Почему поток не завершается через myThread.Abort?
Вопрос в следующем, создаю поток: myThread = new Thread(func); myThread.Start(); в func содержится цикл while (true) { .......


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru