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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
#1

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

24.10.2013, 23:20. Просмотров 1213. Ответов 28
Метки нет (Все метки)

Выдает ошибку: "ОС 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");
}
Делал пошаговую проверку: все считает правильно, но при выводе выбивает.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2013, 23:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка кучи (C++):

Получать различные начала кучи при создании кучи внутри цикла - C++
Можно ли как-то такое провернуть, чтобы на каждой итерации цикла получались различные адреса (выбираются ОС) на начало кучи (периодические...

Ошибка кучи - C++
Здравствуйте, уважаемые программисты. Возникла у меня такая проблема: Задали сделать курсовую работу на С++ через MFC. Суть задачи: В...

Ошибка о повреждение кучи - C++
Вот переделал программу со строками, с использованием классов. Почему-то опять возникает ошибка о повреждение кучи. Не могу понять где...

Ошибка о выходе за границу памяти кучи - C++
Собственно изучаю месяца три, первый мой язык. Сначала был вебинар, сейчас читаю А. Пол. Пока интересно. Собственно вопросы. Есть...

Ошибка повреждения кучи при работе с динамическим стеком - C++
код выдает ошибку повреждения кучи class pixel1 { public: pixel1(int i, int j, int way, int gradient){ pixel1::i = i; ...

Ошибка при "сборе мусора" . Повреждение кучи - C++
Привет ребята! Я совсем скверно знаю плюсы и не смотря на несколько лет довольно успешной работы в ИТ так и не заставил себя заниматься...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 23:23 #2
подумайте о том, что ваши глюки могут зависеть от содержимого файла, который вы читаете и которого тут нет.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 23:39 #3
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Делал пошаговую проверку: все считает правильно, но при выводе выбивает.
В каком месте?
0
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
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 23:48 #5
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Там где cout<<check_strong(state_a,state_b)<<endl;
Если пошагово делали, то в check_strong() заходили? В ней? Где там?
0
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
24.10.2013, 23:54  [ТС] #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Если пошагово делали, то в check_strong() заходили? В ней? Где там?
Да, заходил, на return is_strong
0
alsav22
5419 / 4815 / 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;
}
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
0
alsav22
5419 / 4815 / 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> ]
0
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 13:33  [ТС] #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая? В студии ошибки нет (выводит 5), потому что выход по break происходит при i == 7 (i + 1 в границах массива).
Правда, при компиляции, выводит предупреждение:
Студия, да, именно эту ошибку выводит, но дальше не компилится.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 13:43 #11
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Студия, да, именно эту ошибку выводит, но дальше не компилится.
Так не компилируется или:
Цитата Сообщение от Triathlet23 Посмотреть сообщение
Выдает ошибку: "ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe или в одной из загруженных им DLL."
И какую "именно эту ошибку"?
0
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 13:46  [ТС] #12
Выдает ошибку: "ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe или в одной из загруженных им DLL." и не компилится. Точнее вылетает окно с этой ошибкой.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2013, 13:48 #13
Вот это к чему написали?
Цитата Сообщение от alsav22 Посмотреть сообщение
но дальше не компилится.
Вот это:
Цитата Сообщение от Triathlet23 Посмотреть сообщение
"ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe или в одной из загруженных им DLL."
Ошибка времени выполнения(при запуске), а не компиляции.
0
Triathlet23
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 31
25.10.2013, 14:04  [ТС] #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это к чему написали?

Вот это:

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

Добавлено через 2 минуты
Если: Ctrl + Alt + F7, результат перекомпиляции какой?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2013, 14:09
Привет! Вот еще темы с ответами:

Размер кучи - C++
С помощью какой библиотечной ф-ции или как узнать размер кучи в языке Си?

Повреждение кучи - C++
После выполнения программы выдаёт ошибку Debug Assertion Failed Помогите найти и исправить место из-за которого ошибка, я так понимаю она...

Повреждение кучи - C++
Есть код #include &lt;iostream&gt; using namespace std; struct STUDENT { char NAME; int GROUP; int SES; };

Повреждение кучи - C++
#ifndef _TASK2_H_ #define _TASK2_H_ #include &lt;iostream&gt; using namespace std; namespace TeamResult { static int...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.10.2013, 14:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru