0 / 0 / 1
Регистрация: 16.06.2016
Сообщений: 7
1

Повреждение кучи

12.11.2017, 00:40. Показов 657. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Столкнулся с такой проблемой. Динамически создаются массивы. Но в рандомных местах выдает ошибку. Просто дебагом не смог уловить. Я понимаю что некая ошибка с работой динамической памяти, но какая именно и как исправить? Данные считываются с файла. Уже кучу всего пересмотрел, но конткретики с этим вопросом - нет. Известно только что проблема с динамическим выделением памяти. В частности компилятору не нравится строка:
full_info[k].Chest_info[j] = new int[];
Хелп плиз!

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
struct Keys
{
    
    int iKey_chest_num[2];
    int *iKey_val = new int[];
    int **Chest_info = new int*[];
 
};
 
void main()
{
    
    int *tmp_arr = new int[];
    int test_c = 0;
    int k = 0;
    setlocale(LC_ALL, "rus");
    ifstream fin("D-small-practice.in", ios_base::in); 
    char buff[256];
    fin.close();
    fin.open("D-small-practice.in");
    if (!fin.is_open())
    {
        cout << "Can't open file" << endl;
        return;
    }
    else
    {
        fin.getline(buff, 50);
        test_c = atoi(buff);
        
        cout << "Test cases = " << test_c << endl;
    
    }
    
    Keys *full_info = new Keys[test_c];
    for (k = 0; k < test_c;k++)
    {
        fin.getline(buff, 50);
        char * pch;
        pch = strtok(buff, " ");
        int i = 0;
        while (pch != NULL)
        {
            full_info[k].iKey_chest_num[i] = atoi(pch);
            i++;
            //cout << i << " ";
            pch = strtok(NULL, " ");
        }
        /*for (int i = 0; i < 2; i++)
            cout << full_info[k].iKey_chest_num[i] << " ";
        cout << endl;*/
 
 
 
 
        fin.getline(buff, 50);
        pch = strtok(buff, " ");
        i = 0;
        while (pch != NULL)
        {
            full_info[k].iKey_val[i] = atoi(pch);
            i++;
            //cout << i << " ";
            pch = strtok(NULL, " ");
        }
    
        /*for (int j = 0; j < i; j++)
            cout << full_info[k].iKey_val[j]  << " ";
        cout << endl;*/
 
 
 
        /*for (int z = 0; z < full_info[k].iKey_chest_num[1]+1; z++)
            full_info[k].Chest_info[z] = new int[];*/
 
 
        for (int j = 0; j < full_info[k].iKey_chest_num[1]; j++)
        {
            
            fin.getline(buff, 50);
            pch = strtok(buff, " ");
            int i = 0;
            while (pch != NULL)
            {
                
                tmp_arr[i] = atoi(pch);
                int tmp = tmp_arr[i];           
            //  cout << tmp << " ";
                
                pch = strtok(NULL, " ");
                i++;
            }
            
            //cout << endl;
            full_info[k].Chest_info[j] = new int[];
            full_info[k].Chest_info[j] = tmp_arr;
 
        }
        
        
        
    } 
    
    
 
    
    system("pause");
    fin.close();
    delete [] full_info;
    delete [] tmp_arr;
 
    return;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2017, 00:40
Ответы с готовыми решениями:

std::string, std::fstream, ошибка кучи
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString....

Повреждение кучи memcpy
Программа реализует генетический алгоритм, поэтому была необходимость преобразовывать double в...

как слепить из кучи .resx один .dll ?
Пролог Ребят, я прекрасно понимаю, что своим вопросом насмешу вас...но я в этом полный...

Массив строк, используя кучи Windows
Решил попробовать организовать работу с кучами вместо использования стандартных методов new,...

4
Native x86
Эксперт Hardware
5590 / 3334 / 951
Регистрация: 13.02.2013
Сообщений: 10,583
12.11.2017, 01:43 2
Данная ошибка почти всегда означает переполнение буфера. Когда выделили массив, скажем, в 10 байт, а записали потом в него 11 или еще больше. От этого и пляшите при дебаге.
0
4263 / 3322 / 925
Регистрация: 25.03.2012
Сообщений: 12,508
Записей в блоге: 1
12.11.2017, 03:03 3
int *tmp_arr = new int[];
Вы правда настолько наивны, что бывают массивы без размера? Как удобно, блин! Завёл такой массив и храни в нём хоть гигабайт!
Короче, вам не массив нужен, а std::vector!
ну, в крайнем случае, массив какого-то известного size, который вы выделите new int[size]
Пользуйтесь векторами, либо сначала определяйте размер файла, который читаете!
0
0 / 0 / 1
Регистрация: 16.06.2016
Сообщений: 7
12.11.2017, 05:06  [ТС] 4
Ну тем не менее это каким то макаром работает) С вектором я не знаком, но замечание подтолкнуло на мысль, спасибо.
0
4263 / 3322 / 925
Регистрация: 25.03.2012
Сообщений: 12,508
Записей в блоге: 1
12.11.2017, 05:27 5
Цитата Сообщение от FARADEYua Посмотреть сообщение
Ну тем не менее это каким то макаром работает)
Нет, это не работает. И впредь, советую изучать возможности языка по хорошим книгам и справочным документам, а не по принципу "а напишу, что попало от балды и проверю, работает или нет. Если показалось, что работает так и буду писать."

Поэтому не спорьте, просто молчите и не спорьте. В крайнем случае, можете поискать в книгах Страуструппа доказательство своей "правоты" с new. Но лучше не тратьте время и выкиньте из головы свои заблуждения. Этот язык программирования не вы создавали, и он не обязан совпадать с вашей логикой, каким бы там логичным вам ни казалось написание "arr = new int[];"
0
12.11.2017, 05:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2017, 05:27
Помогаю со студенческими работами здесь

Как удалить объект класс из кучи по указателю?
Как удалить экземпляр класса из кучи по указателю? Есть простенький код: запускает два потока,...

В каких случаях необходимо использовать CreateHeap — для чего нужно создавать еще кучи
Я пишу работу по исследованию кучи, все написал, но на предварительном отчете получил следующие...

Как изменить размер "кучи"?
Создаю &quot;кучу&quot;: HANDLE NewHeap; int Size=0x4000; NewHeap=HeapCreate(0, Size, 0); if (NewHeap...

Повреждение кучи
#ifndef _TASK2_H_ #define _TASK2_H_ #include &lt;iostream&gt; using namespace std; namespace...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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