Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/92: Рейтинг темы: голосов - 92, средняя оценка - 4.77
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170

.exe вызвал срабатывание точки останова (работаем с выделением памяти)

29.10.2015, 17:31. Показов 19571. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При работе программы выдает ошибку "rook.exe вызвал срабатывание точки останова", если нажать "продолжить", то скажет, что куча повреждена.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    Groups(int rows, int colomns, Cell **board)
    {
        this->rows = rows;
        this->colomns = colomns;
        this->board = board;
        
        massives_in_rows = new int[rows];
        massives_in_colomns = new int[colomns];
    
        for (int i = 0; i < colomns; i++)
            massives_in_rows[i] = 0;
    
        // char *sdf = new char[10];     тут нет ошибки
 
        for (int i = 0; i < rows; i++)
            massives_in_colomns[i] = 0;
 
        char *sdf = new char[10];   // тут ошибка
    }
Как я понимаю проблема в нехватке памяти.
Есть два разных файла.
С небольшим файлом программа работает полностью корректно.
С другим файлом (куда более большим), выдает эту ошибку.

Выше указана функция, где появляется ошибка.
В первом случае (строка закомментирована) ошибка не появляется.
Во втором случае (последняя строка) уже ошибка.

В чем проблема?
Если и правда памяти не хватает, то почему, если присвоить значения нескольким int (память для них уже давно выделена), то памяти не хватает, и как эту память расширить/сэкономить.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2015, 17:31
Ответы с готовыми решениями:

.exe вызвал срабатывание точки останова (работаем с выделением памяти)
Добрый вечер, писал программу, выделяя память в куче под массив объектов, использовал оператор new вот код teacher *list = new...

Exe вызвал срабатывание точки останова
Насколько я понимаю, это утечка памяти. Не могу понять почему, matrix вроде нормально очищает память. Ошибка возникает только при при...

Exe вызвал срабатывание точки останова c++
Здравствуйте, при попытке скомпилировать код программа вылетает со следующим сообщение:&quot;проект.exe вызвал срабатывание точки...

15
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
29.10.2015, 17:57
Ошибка зависит только от позиции строки (до цикла или после цикла)? Или у тебя их две, но одну комментируешь?
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
29.10.2015, 18:03  [ТС]
Ошибка возникает именно там, где строка не закомментирована.
Если убрать обе строки, то ошибка возникнет потом (при выделении памяти), я просто вычислил самое первое место, где при выделении памяти появляется ошибка.
Если закомментировать вторую строку и раскомментировать первую, то ошибки в этой функции не будет.
Будет потом, при выделении памяти.

Так, что зависит именно от позиции строки.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
29.10.2015, 18:05
Из этого кусочка ничего не ясно. Или ты где-то не освобождаешь память или выделяешь слишком много.
Сколько программа потребляет памяти?
Лови исключение bad_alloc при выделении.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
29.10.2015, 18:09
Цитата Сообщение от Lensato Посмотреть сообщение
C++
1
2
3
4
5
6
massives_in_rows = new int[rows];
massives_in_colomns = new int[colomns];
for (int i = 0; i < colomns; i++)
    massives_in_rows[i] = 0; // выход за границы, если rows < colomns
for (int i = 0; i < rows; i++)
    massives_in_colomns[i] = 0; // выход за границы, если colomns < rows
а количество строк и столбцов одинаково?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.10.2015, 18:10
Цитата Сообщение от nmcf Посмотреть сообщение
Из этого кусочка ничего не ясно.
Вообще-то все ясно. Ну по крайней мере что-то точно ясно. Например то, что в rows он пишет column нулей, а в column - rows нулей. Перепутал размеры, короче говоря.
Цитата Сообщение от Lensato Посмотреть сообщение
C++
1
2
3
4
5
6
7
        for (int i = 0; i < colomns; i++)
            massives_in_rows[i] = 0;
    
        // char *sdf = new char[10];     тут нет ошибки
 
        for (int i = 0; i < rows; i++)
            massives_in_colomns[i] = 0;
Надо так:
C++
1
2
3
4
5
        for (int i = 0; i < rows; i++)
            massives_in_rows[i] = 0;
    
        for (int i = 0; i < colomns; i++)
            massives_in_colomns[i] = 0;
2
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
30.10.2015, 09:36  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще-то все ясно. Ну по крайней мере что-то точно ясно. Например то, что в rows он пишет column нулей, а в column - rows нулей. Перепутал размеры, короче говоря.
Сообщение от Lensato
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
for (int i = 0; i < colomns; i++)
 massives_in_rows[i] = 0;
// char *sdf = new char[10]; * * тут нет ошибки
for (int i = 0; i < rows; i++)
 massives_in_colomns[i] = 0;
Нет, нет, тут все верно, так и должно быть.
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
а количество строк и столбцов одинаково?
Количество строк и столбцов разное.
Цитата Сообщение от nmcf Посмотреть сообщение
Лови исключение bad_alloc при выделении.
Кликните здесь для просмотра всего текста
C++
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
26
    Groups(int rows, int colomns, Cell **board)
    {
        this->rows = rows;
        this->colomns = colomns;
        this->board = board;
        try
        {
            massives_in_rows = new int[rows];
            massives_in_colomns = new int[colomns];
 
            for (int i = 0; i < colomns; i++)
                massives_in_rows[i] = 0;
 
            // char *sdfd = new char[10];    //тут нет ошибки
 
            for (int i = 0; i < rows; i++)
                massives_in_colomns[i] = 0;
 
            char *sdf = new char[10];   // тут ошибка
        }
        catch (std::bad_alloc &ba)
        {
            cout << ba.what() << endl;
            system("pause");
        }
    }

Исключение не ловится.

Решил прикрепить всю прогу.
1. main.cpp
2. test1.txt (большой файл)
3. test1.txt (маленький файл)

main.cpp считывает из файла test1 инфу, и обрабатывает ее.
Файл с данным должен быть назван именно "test1.txt"
Если файл маленький, то все работает как надо.
Если большой, то все плохо.

Я бы рад и сам найти ошибку, но даже не понимаю где и что искать.
Ясно только, что проблема с выделением памяти.
Вложения
Тип файла: zip main.zip (5.7 Кб, 3 просмотров)
Тип файла: txt test1 (5 9).txt (58 байт, 6 просмотров)
Тип файла: txt test1 (10 47).txt (58 байт, 5 просмотров)
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
30.10.2015, 09:45
Цитата Сообщение от Lensato Посмотреть сообщение
Нет, нет, тут все верно, так и должно быть.
Как так-то, а? Вам два неглупых человека говорят, что вы выделяете одно количество элементов под массив, а для заполнения в цикле используете другое значение для количества элементов.
Цитата Сообщение от Lensato Посмотреть сообщение
Исключение не ловится.
И вряд ли отловится, т.к. скорее всего у вас HEAP CORRUPTION или ACCESS VIOLATION.
Цитата Сообщение от Lensato Посмотреть сообщение
Решил прикрепить всю прогу.
Так выкладывайте в виде кода, если большой код, его можно под спойлер спрятать.
1
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
30.10.2015, 09:55  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Так выкладывайте в виде кода, если большой код, его можно под спойлер спрятать.
Выложить текстовкой не могу, слишком много букв.
"Вы ввели слишком длинный текст (25565 символов). Пожалуйста, сократите его до 15000 символов."

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Как так-то, а? Вам два неглупых человека говорят, что вы выделяете одно количество элементов под массив, а для заполнения в цикле используете другое значение для количества элементов.
Точно, плохо смотрел. Буду править.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
30.10.2015, 10:10
Цитата Сообщение от Lensato Посмотреть сообщение
"Вы ввели слишком длинный текст (25565 символов). Пожалуйста, сократите его до 15000 символов."
а если содержимое каждого файла в отдельное сообщение?
1
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
30.10.2015, 10:18  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
а если содержимое каждого файла в отдельное сообщение?
Хороший вариант, как-то не догадался )
Правда файл main один, но разбить не проблема.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.10.2015, 11:18
Цитата Сообщение от Lensato Посмотреть сообщение
Точно, плохо смотрел.
Помимо этой, в коде еще куча проблем.

Посмотрел по диагонали, основная ошибка (и вероятно причина std::bad_alloc) это то, что почти везде перепутаны row и col. Например вот тут:
C++
1
2
3
4
5
6
7
8
    void GiveMemoryTo_cells_in_massives_in_colomns()
    {
        cells_in_massives_in_colomns = new int*[rows];
        for (int i = 0; i < rows; i++)
                {
            cells_in_massives_in_colomns[i] = new int[massives_in_colomns[i]];
                }
    }
Ну вот где, скажи на милость, здесь гарантия, что в massives_in_colomns элементов не больше, чем rows или наоборот, меньше, чем rows.
Только не надо говорить, что оно так и задумано. Если ты посмотришь под отладчиком или просто выведешь числа, которые выдает massives_in_colomns[i],
то увидишь нечто такое:
1
1
1
3
19
1245389905
Естественно, число 1245389905, переданное в качестве размера массива в new, приведет к генерации std::bad_alloc (который ты кстати успешно не ловишь)
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
30.10.2015, 11:56  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну вот где, скажи на милость, здесь гарантия, что в massives_in_colomns элементов не больше, чем rows или наоборот, меньше, чем rows.
Именно то, что colomn и row перепутаны намеренно (причины сложны и даже я с трудом их понимаю), я в первый раз не внимательно посмотрев, сказал что все так и должно быть.

Косвенной причиной, что все работает правильно является безошибочная работа программы с разными исходными данными. Ну и вообще старался конечно следить.
Кроме того, для проверки специально написал функции ShowMassivesInRows() и ShowMassivesInColomns(), они все показывают верно.
А так то да, надо конечно следить очень внимательно и пожалуй делать больше проверок, чем у меня сейчас.
Ну и к сожалению, мое великолепное чтение файла данных с учетом всех ошибок пришлось выбросить в топку, когда пришлось поменять местами строки и столбцы. Так что если файл исходных данных заполнен не корректно, программа завершится аварийно. Потом буду это править. В остальном, если появляются ошибки, то это косяки о которых я не знаю и их быть не должно.

Вот текущая версия проги, тут все корректно. Так и должно быть =)
Вложения
Тип файла: zip main.zip (5.7 Кб, 4 просмотров)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.10.2015, 13:53
Цитата Сообщение от Lensato Посмотреть сообщение
Именно то, что colomn и row перепутаны намеренно (причины сложны и даже я с трудом их понимаю), я в первый раз не внимательно посмотрев, сказал что все так и должно быть.
Не вопрос, речь-то шла не о том, что они вообще не могут быть перепутаны, а о том, что нельзя их путать, если выделялось памяти не то количество. Т.е. нельзя выделять row памяти, а потом работать с ней так, как будто ее column.
Понимаешь?

Цитата Сообщение от Lensato Посмотреть сообщение
тут все корректно
Я бы так не сказал.
Она же падает у тебя вот на этой строке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        // для групп строк
        for (int i = 0; i < rows; i++)
        {
            massives_quantity = massives_in_rows[i];
 
            for (int k = 0; k < massives_quantity; k++)
            {
                cells_quantity = cells_in_massives_in_rows[i][k]; // тут
 
                for (int n = 0; n < cells_quantity; n++)
                    row_groups[i][k][n]->row_massive_number = k;
            }
        }
А все почему, потому ты сам меня убеждал, что нужно переставлять местами размерности, а тут сам же их не переставил.
Если согласовать этот код с остальной логикой, то должно быть так:
C++
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
26
27
        // для групп столбцов
        for (int i = 0; i < rows; i++) //!< внимание, заменено colomns -> rows, т.к. памяти massives_in_colomns выделялось rows
        {
            massives_quantity = massives_in_colomns[i];
 
            for (int k = 0; k < massives_quantity; k++)
            {
                cells_quantity = cells_in_massives_in_colomns[i][k];
 
                for (int n = 0; n < cells_quantity; n++)
                    colomn_groups[i][k][n]->colomn_massive_number = k;
            }
        }
 
        // для групп строк
        for (int i = 0; i < colomns; i++) //!< внимание, заменено rows -> colomns, т.к. памяти в massives_in_rows выделялось  colomns
        {
            massives_quantity = massives_in_rows[i];
 
            for (int k = 0; k < massives_quantity; k++)
            {
                cells_quantity = cells_in_massives_in_rows[i][k];
 
                for (int n = 0; n < cells_quantity; n++)
                    row_groups[i][k][n]->row_massive_number = k;
            }
        }
Что характерно, функции ShowMassives... написаны правильно

Учись, короче говоря, пользоваться отладчиком.

Valgrind в твоей программе еще 12 ошибок нашел.
И есть еще одна, которая проявится, если файл открыть не удалось.
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
30.10.2015, 14:09  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Она же падает у тебя вот на этой строке:
Да, это я не поправил назад перед отправкой )
Как только запихнул файл побольше, сразу и выскочила. Надо было поменять размерности.
Отладчиком пользоваться вполне себе умею, просто прога пока в стадии написания.
А вот на счет "Valgrind в твоей программе еще 12 ошибок нашел. ", это интересно.
Если это просто лишние куски кода, то ладно. Если другое, то надо посмотреть.
Гляну пока что такое Valgrind...

На счет открытия файла, странно.
C++
1
2
3
// открываем файл
if (!file)
throw cant_open_file;
Это должно отлично отлавливать любое не правильное открытие файла. Когда только писал, вроде проверял.
Где ошибка?

Добавлено через 5 минут
А, ну так верно.
Это раньше все отлавливалось.
Потом начал сильно переделывать структуру программы и поскольку чтение данных все-равно было очень долго исправлять, то вообще забил на отлов ошибок при чтении файла.
Ошибка в целом ловится, но далее как положено не обрабатывается из-за новой структуры.
Потом. Все потом сделаю...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.10.2015, 14:10
Цитата Сообщение от Lensato Посмотреть сообщение
Если это просто лишние куски кода, то ладно.
Не, это именно ошибки работы с памятью.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2015, 14:10
Помогаю со студенческими работами здесь

Exe вызвал срабатывание точки останова
У меня есть класс Студент и Группа. #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; #include &lt;cstdlib&gt; ...

.exe вызвал срабатывание точки останова
Почему так происходит, пример из учебника. #include &lt;stdio.h&gt; #include &quot;mpi.h&quot; #include &quot;conio.h&quot; int main(int argc,...

Test.exe вызвал срабатывание точки останова
После нажатия Enter при завершении работы, выводит эту ошибку. Среда разработки VS2017 #include &lt;iostream&gt; #include...

Exe-файл вызвал срабатывание точки останова
Всех приветствую! Использую визуал 2017. Мне сбросили проект готовый, мне нужно его скомпилировать. При попытке компиляции выдает...

Ошибка: ConsoleApplication1.exe вызвал срабатывание точки останова
Потихоньку начинаю разбираться в работе с файлами, но пока без особых успехов. Прекрасно понимаю, что это ужаснейший говнокод, буду...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru