Форум программистов, компьютерный форум CyberForum.ru

Ошибка кучи - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
24.10.2013, 23:20     Ошибка кучи #1
Выдает ошибку: "ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe или в одной из загруженных им DLL."
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <fstream>
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
const int n=9;
int sort(int *a)
{
    for(int i = 0; i < n; ++i) // i - номер текущего шага
    { 
        int pos = i; 
        int tmp = a[i];
        for(int j = i + 1; j < n; ++j) // цикл выбора наименьшего элемента
        {
            if (a[j] <= tmp) 
           {
               pos = j; 
               tmp = a[j]; 
           }
        }
        a[pos] = a[i];
        a[i] = tmp; // меняем местами наименьший с a[i]
    }
    return *a;
}
int check_strong(int *arr1,int *arr2)
{
    int is_strong;
    *arr1=sort(arr1);
    *arr2=sort(arr2);
    int *arr3=new int [n];
    merge(arr1, arr1 + n, arr2, arr2 + n, arr3);
    delete arr1;delete arr2;
    for (int i=0;i<2*n;i++)
    {
        if (arr3[i+1]-arr3[i]>1)
        {is_strong=(arr3[i]+arr3[i+1])/2;break;}
        else is_strong=0;
    }
    return is_strong;
    
}
int main()
{
    ifstream infile("input.txt");
    setlocale(0,"Rus");
    int *a1=new int[n];
    int *state_a=new int [n];
    char *symbol_a=new char [n];
    int *state_b=new int [n];
    char *symbol_b=new char [n];
    int i;
    while (!infile.eof())
    {
        for (int i=0; i<n;i++)
        infile>>a1[i]>>state_a[i]>>symbol_a[i]>>state_b[i]>>symbol_b[i];
    }
    cout<<check_strong(state_a,state_b)<<endl;
    system("PAUSE");
}
Делал пошаговую проверку: все считает правильно, но при выводе выбивает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2013, 23:20     Ошибка кучи
Посмотрите здесь:

Границы кучи C++
C++ Ошибка о повреждение кучи
C++ Повреждение кучи
Повреждение кучи C++
Ошибка при "сборе мусора" . Повреждение кучи C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 23:23     Ошибка кучи #2
подумайте о том, что ваши глюки могут зависеть от содержимого файла, который вы читаете и которого тут нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 23:39     Ошибка кучи #3
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Делал пошаговую проверку: все считает правильно, но при выводе выбивает.
В каком месте?
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
24.10.2013, 23:46  [ТС]     Ошибка кучи #4
Там где cout<<check_strong(state_a,state_b)<<endl;

Добавлено через 1 минуту
Цитата Сообщение от DU Посмотреть сообщение
подумайте о том, что ваши глюки могут зависеть от содержимого файла, который вы читаете и которого тут нет.
Считывает все правильно, проверял
Файл вида
1 2 x 5 y
2 3 x 4 y
...
9 4 x 7 y
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 23:48     Ошибка кучи #5
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Там где cout<<check_strong(state_a,state_b)<<endl;
Если пошагово делали, то в check_strong() заходили? В ней? Где там?
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
24.10.2013, 23:54  [ТС]     Ошибка кучи #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Если пошагово делали, то в check_strong() заходили? В ней? Где там?
Да, заходил, на return is_strong
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 00:15     Ошибка кучи #7
Строк в файле сколько?

Добавлено через 16 минут
Файл давайте. Может от данных зависит. Я взял три выложенные строчки:
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Файл вида
1 2 x 5 y
2 3 x 4 y
...
9 4 x 7 y
С ними ошибки нет. Но вот в этом месте, если код дойдёт до последней итерации (с этими данными не доходит, выход по break раньше происходит), будет выход за границу массива:
C++
1
2
3
4
5
6
7
8
9
for (int i=0;i<2*n;i++)
{
     if (arr3[i+1]-arr3[i]>1)
     {
           is_strong=(arr3[i]+arr3[i+1])/2;
           break;
     }
     else is_strong=0;
}
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 13:13  [ТС]     Ошибка кучи #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Строк в файле сколько?

Добавлено через 16 минут
Файл давайте. Может от данных зависит. Я взял три выложенные строчки:
С ними ошибки нет. Но вот в этом месте, если код дойдёт до последней итерации (с этими данными не доходит, выход по break раньше происходит), будет выход за границу массива:
C++
1
2
3
4
5
6
7
8
9
for (int i=0;i<2*n;i++)
{
     if (arr3[i+1]-arr3[i]>1)
     {
           is_strong=(arr3[i]+arr3[i+1])/2;
           break;
     }
     else is_strong=0;
}
Я проверял без использования функции и все работает нормально,а сделал функцию и вылетела ошибка.
Вот входной файл:
1 2 x 3 x
2 4 x 6 x
3 2 x 1 x
4 2 x 3 y
5 9 x 3 y
6 9 y 7 x
7 8 x 8 x
8 7 x 7 x
9 7 x 6 x
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 13:27     Ошибка кучи #9
Среда какая? В студии ошибки нет (выводит 5), потому что выход по break происходит при i == 7 (i + 1 в границах массива).
Правда, при компиляции, выводит предупреждение:
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(3098): warning C4996: 'std::_Merge1': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(3076): см. объявление "std::_Merge1"
1> main.cpp(327): см. ссылку на создание экземпляров функции шаблон при компиляции "_OutIt std::merge<int*,int*,int*>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)"
1> with
1> [
1> _OutIt=int *,
1> _InIt1=int *,
1> _InIt2=int *
1> ]
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 13:33  [ТС]     Ошибка кучи #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая? В студии ошибки нет (выводит 5), потому что выход по break происходит при i == 7 (i + 1 в границах массива).
Правда, при компиляции, выводит предупреждение:
Студия, да, именно эту ошибку выводит, но дальше не компилится.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 13:43     Ошибка кучи #11
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Студия, да, именно эту ошибку выводит, но дальше не компилится.
Так не компилируется или:
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Выдает ошибку: "ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe или в одной из загруженных им DLL."
И какую "именно эту ошибку"?
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 13:46  [ТС]     Ошибка кучи #12
Выдает ошибку: "ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe или в одной из загруженных им DLL." и не компилится. Точнее вылетает окно с этой ошибкой.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 13:48     Ошибка кучи #13
Вот это к чему написали?
Цитата Сообщение от alsav22 Посмотреть сообщение
но дальше не компилится.
Вот это:
Цитата Сообщение от Triathlet23 Посмотреть сообщение
"ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe или в одной из загруженных им DLL."
Ошибка времени выполнения(при запуске), а не компиляции.
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 14:04  [ТС]     Ошибка кучи #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это к чему написали?

Вот это:

Ошибка времени выполнения(при запуске), а не компиляции.
Вы написали, что у вас все работает, но выдает предупреждение, а я ответил, что у меня сразу выдает ошибку.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 14:09     Ошибка кучи #15
Цитата Сообщение от Triathlet23 Посмотреть сообщение
у меня сразу выдает ошибку.
Ошибку при запуске или при компиляции? Разницу, надеюсь, понимаете?

Добавлено через 2 минуты
Если: Ctrl + Alt + F7, результат перекомпиляции какой?
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 14:17  [ТС]     Ошибка кучи #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибку при запуске или при компиляции? Разницу, надеюсь, понимаете?

Добавлено через 2 минуты
Если: Ctrl + Alt + F7, результат перекомпиляции какой?
Ошибка при запуске.

выдает "5", правильный ответ.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 14:20     Ошибка кучи #17
Цитата Сообщение от Triathlet23 Посмотреть сообщение
выдает "5"..правильный ответ.
У вас что, если нажать Ctrl + Alt + F7, программа запускается?
На вопрос когда-нибудь ответите?
Цитата Сообщение от alsav22 Посмотреть сообщение
результат перекомпиляции какой?
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 14:25  [ТС]     Ошибка кучи #18
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас что, если нажать Ctrl + Alt + F7, программа запускается?
На вопрос когда-нибудь ответите?
Я вас наверное не понял. Нажал "продолжить" и выдало ответ.

Когда нажимать Ctrl + Alt + F7?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 14:30     Ошибка кучи #19
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Когда нажимать Ctrl + Alt + F7?
Просто нажать. Будет сделана перекомпиляция кода. Результат покажите.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2013, 14:33     Ошибка кучи
Еще ссылки по теме:

Повреждение кучи C++
C++ Получать различные начала кучи при создании кучи внутри цикла
C++ Ошибка о выходе за границу памяти кучи

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

Или воспользуйтесь поиском по форуму:
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 14:33  [ТС]     Ошибка кучи #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Просто нажать. Будет сделана перекомпиляция кода. Результат покажите.
Ничего не происходит.
Yandex
Объявления
25.10.2013, 14:33     Ошибка кучи
Ответ Создать тему
Опции темы

Текущее время: 11:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru