Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/64: Рейтинг темы: голосов - 64, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11

Куча была повреждена и прочие радости

05.03.2017, 17:45. Показов 12833. Ответов 22

Студворк — интернет-сервис помощи студентам
В каждом байте BMP изображения программа подменяет последние несколько бит на биты какого-то файла (отдельно есть алгоритм, извлекающий эту информацию, но с ним ничего нельзя сделать пока не заработает этот). За два месяца 4 раза полностью с нуля переписывал код, перепробовал все, что только смог за это время придумать, но на выходе всегда получал одно и то же: "ConsoleApplication11 triggered a breakpoint", и после либо "Куча была повреждена", либо "Read access violation", либо какие-нибудь другие ошибки, которые я даже идентифицировать не в состоянии. Краткие комментарии в коде есть, но могу в любой момент подробно описать, что делает любой участок кода. Буду безмерно благодарен человеку, которому удастся прекратить мои страдания, или хотя-бы немного приблизит меня к решению проблемы.
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
// ConsoleApplication11.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int b1,     ///
    b2,     ///possible b-coefficient values
    b3,     ///
    cb = 5; //current b-coefficient
 
unsigned long filesize(const char* FullPath);
string bin(int DecNumber);
int dec(string BinNumber);
int getcb(int b_coeff_code);
 
int main(int argc, char* argv[])
{
    //argv[1] - Container path
    //argv[2] - inf-file path
    //argv[3] - b mode
    //argv[4] - out file path
 
    string n = "C:\\AZ\\ft1.bmp";
 
#pragma region /REGION/
    int i;  //counter
    char* impath = "C:\\AZ\\22802_7320c86e0504dccb6e2bdb709c0986a0.bmp";    //container path
    int size0 = filesize(impath);   //getting container size
    unsigned char *source = new unsigned char[size0];   //container byte array
    ifstream imfile(impath, ios::binary);
    for (i = 0; i < size0; i++) //filling container array
    {
        *(source + i) = imfile.get();
    }
    imfile.close();
    char* flpath = "C:\\AZ\\ft1.bmp";   //inf-file path
    union
    {
        unsigned long num;
        unsigned char bin[4];
    } size1;
    size1.num = filesize(flpath);   //getting inf-file size
    unsigned char *m = new unsigned char[size1.num];    //inf-file byte array
    ifstream infile(flpath, ios::binary);
    for (i = 0; i < size1.num; i++) //filling inf-file array
    {
        *(m + i) = infile.get();
    }
    infile.close();
#pragma region /REGION/
    string bm = "3";    //b-coefficient code
    int b,      //b-coefficient
        imcsize,    //container cluster size
        flcsize;    //inf-file cluster size
 
    if (bm == "1")
    {
        b = 1;
        bm = "001";
        imcsize = 8;
        flcsize = 1;
    }
    if (bm == "2")
    {
        b = 2;
        bm = "011";
        imcsize = 4;
        flcsize = 1;
    }
    if (bm == "3")
    {
        b = 4;
        bm = "111";
        imcsize = 2;
        flcsize = 1;
    }
 
    if (bm == "4")
    {
        b = 10;
        bm = "000";
        imcsize = 16;
        flcsize = 1;
    }
    if (bm == "5")
    {
        b = 21;
        bm = "010";
        imcsize = 16;
        flcsize = 3;
    }
    if (bm == "6")
    {
        b = 42;
        bm = "101";
        imcsize = 8;
        flcsize = 3;
    }
 
    if (bm == "7")
    {
        b = 210;
        bm = "100";
        imcsize = 24;
        flcsize = 3;
    }
    if (bm == "8")
    {
        b = 421;
        bm = "110";
        imcsize = 24;
        flcsize = 7;
    }
#pragma endregion Working with b-coefficient
    int width = 0//bmp image width (pixels)
        height = 0; //bmp image height (pixels)
    for (i = 0; i < 4; i++)
    {
        width += *(source + 18 + i)*pow(16.0, i * 2);
        height += *(source + 22 + i)*pow(16.0, i * 2);
    }
    int c1 = 0,                 //counter 1
        c2 = 4,                 //counter 2
        c3 = bm.length() - 1;   //counter 3
    char ext[4];
    do  //getting inf-file extention
    {
        if (c1 < 5)
            ext[c2] = flpath[c3];
        c2--;
        c3--;
        c1++;
    } while (flpath[c3] != '.');
    int rst = *(source + 10),       //first raster byte in container
        bpp = *(source + 28),       //number of bits per each pixel
        llb = width*bpp / 8,    //number of image bytes in eash container string
        lgb;                    //number of garbage butes in each container string
    unsigned char *v = new unsigned char[llb*height];   //array of raster bytes
    if (llb % 4 != 0) { lgb = 4 - llb % 4; }
    else { lgb = 0; }
    for (i = 0; i < height; i++)    //filling raster array
    {
        for (c2 = 0; c2 < llb; c2++)
        {
            *(v + i*llb + c2) = *(source + rst + i*(llb + lgb) + c2);
        }
    }
    int *gs = new int;
    if (lgb != 0) *gs = lgb*height;
    else *gs = 1;
    unsigned char *g = new unsigned char[*gs];  //array of garbage bytes
    for (i = 0; i < *gs; i++) { g[i] = dec("00000000"); }
#pragma region /REGION/
    unsigned char header[9];    //information about inf-file
    for (i = 0; i < 4; i++)     //size
    {
        header[i] = size1.bin[i];
    }
    for (i = 0; i < 5; i++)     //extention
    {
        header[i + 4] = ext[i];
    }
    unsigned char *f = new unsigned char[size1.num + 9];    //array of garbage bytes
    for (i = 0; i < 9; i++) { f[i] = header[i]; }
    for (i = 0; i < size1.num; i++) { f[i + 9] = m[i]; }
#pragma endregion Working with header
#pragma endregion Getting needed information
#pragma region /REGION/
    #pragma region /REGION/
    int s0;
    if (size1.num <= (llb*height - 3) / imcsize * flcsize) { s0 = size1.num / flcsize; }
    else { s0 = size0 / imcsize; }
    unsigned char   *imcluster = new unsigned char[imcsize];    //image cluster (bytes)
    unsigned char   *flclusterb = new unsigned char[flcsize * 8];   //inf-file cluster (bits)
    c1 = 3; //for reading image bytes
    c3 = 0; //for reading inf-file bytes
    unsigned long   c4 = 0, //counter 4
                    c5 = 0; //counter 5
    string  imcsb,  //string expression of one byte from image cluster
            flcsb;  //string expression of one byte from inf file cluster
#pragma endregion Preparations
    for (i = 0; i < s0; i++)
    {
        for (int j = 0; j < imcsize; j++) { *(imcluster + j) = *(v + c1); c1++; }   //getting image cluster (bytes)
        for (int j = 0; j < flcsize; j++)   //getting inf-file cluster (bits)
        {
            flcsb = bin(*(f + c3));
            for (int j = 0; j < flcsize * 8; j++)
            {
                for (int k = 0; k < 8; k++)
                {
                    flclusterb[c4] = flcsb[k];
                    c4++;
                }
            }
            c3++;
        }
        cb = getcb(b);  //getting current b-coefficient value
        c4 = 0;
        if (cb == 0) { c5++; continue; }
        for (int j = 0; j < imcsize; j++)   //modifying image cluster
        {
            imcsb = bin(*(imcluster + c5));
            for (int k = 8 - b; k < 8; k++)
            {
                imcsb[k] = *(flclusterb + c4);
                c4++;
            }
            *(imcluster + c5) = dec(imcsb);
            c5++;
        }
        for (int j = c1 - imcsize; j < c1; j++) //rewriting image cluster
        {
            *(v + j) = imcluster[j - c1 + imcsize];
        }
        c4 = 0;
        c5 = 0;
        if (i % 1000 == 0)
        {
            system("cls");
            cout << i/1000 << "K / " << s0;
        }
    }
    if ((size1.num < (llb * height - 3) / imcsize * flcsize) && (size1.num % flcsize != 0))
        for (i = 0; i < size1.num - size1.num / flcsize * flcsize; i++)
        {
            flcsb = bin(*(f + c3));
            for (int j = 0; j < 4; j++) { *(imcluster + j) = *(v + c1); c1++; } //getting image cluster (bytes)
            for (int j = 0; j < 4; j++)
            {
                imcsb = bin(*(imcluster + j));
                for (int k = 6; k < 8; k++)
                {
                    imcsb[k] = flcsb[c4];
                    c4++;
                }
            }
            for (int j = c1 - 4; j < c1; j++)   //rewriting image cluster
            {
                *(v + j) = imcluster[j - c1 + 4];
            }
            c4 = 0;
            c5 = 0;
        }
    if (size1.num > (llb * height - 3) / imcsize * flcsize)
        for (i = 0; i < size1.num - size0 / imcsize * flcsize; i++) { g[i] = *(f + c3); c3++; }
    c1 = 0;
    c2 = 0;
    for (i = 0; i < height; i++)
    {
        if (i == 0)
        {
            for (int j = 3; j < llb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
            for (int j = llb; j < llb + lgb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
            continue;
        }
        for (int j = 0; j < llb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
        for (int j = llb; j < llb + lgb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
    }
#pragma endregion Writing data
    ofstream outfile("C\\AZ\\ddd.bmp", ios::binary);
    for (i = 0; i < size0; i++)
    {
        outfile << source[i];
    }
    outfile.close();
    return 0;
}
 
unsigned long filesize(const char *FullPath)
{
    struct stat file_stat;
    stat(FullPath, &file_stat);
    return file_stat.st_size;
}
string bin(int DecNumber)
{
    string s;
    int r = DecNumber;
    for (int i = 0; i < 8; i++)
    {
        if (r % 2 == 0) { s = '0' + s; }
        else { s = '1' + s; }
        r = r / 2;
    }
    return s;
}
int dec(string BinNumber)
{
    int n = 0;
    for (int i = 0; i < 8; i++)
    {
        if (BinNumber[i] == '1') { n += pow(2.0, (7 - i)); }
    }
    return n;
}
int getcb(int b_coeff_code)
{
    if (b_coeff_code < 5) { return b_coeff_code; }
    if ((b_coeff_code > 9) && (b_coeff_code < 43))
    {
        b1 = b_coeff_code % 10;
        b2 = b_coeff_code / 10;
        if (cb == 5) { return b1; }
        if (cb == b1) { return b2; }
        else { return b1; }
    }
    if (b_coeff_code > 209)
    {
        b1 = b_coeff_code % 10;
        b2 = b_coeff_code / 10 % 10;
        b3 = b_coeff_code / 100;
        if (cb == 5) { return b1; }
        if (cb == b1) { return b2; }
        if (cb == b2) { return b3; }
        if (cb == b3) { return b1; }
    }
}
P.S.
Пользуюсь MSVS 2015
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.03.2017, 17:45
Ответы с готовыми решениями:

Необработанное исключение: куча была повреждена
Какие типичные причины ошибки на прилагаемом скриншоте?

Куча была повреждена, работа с указателями
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using namespace std; int main() { int iloscproblem; cin &gt;&gt;...

Куча была повреждена. При выделении памяти
Всем привет. Вот в этой строчке(83) : XY-&gt;NextXY = new StructXY; Не понимаю что не так. После её работы выдаёт что куча повреждена. ...

22
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
06.03.2017, 11:03
Студворк — интернет-сервис помощи студентам
я вам ссылку привел в самом начале. почитайте оттуда пост #3 про стек вызовов. там написано, как найти место, как вы попали в это место и как можно попытаться понять, почему вы в него попали.
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
06.03.2017, 17:25  [ТС]
DU3, это все я уже делал, но главную причину так и не нашел
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
10.03.2017, 23:53
засрали память, и поэтому падать может где и как угодно. в вашем коде сложно что либо понять.
возможно у вас там миллион проблем. вот как я нашел одну из них:
заменил вырой массив на вектор:
C++
1
2
    //unsigned char *v = new unsigned char[llb*height];   //array of raster bytes
    std::vector<unsigned char> v(llb*height, 0);
далее надо поправить код, чтобы компилировался.
выражения вроде *(v + someOffset) заменяется на v[someOffset]

далее в дебаге при выходе за пределы вектора срабатывает ассерт (поэтому сырой массив на вектор и поменял). Если подняться по стеку, то попадаем на строку
for (int j = 0; j < imcsize; j++) { *(imcluster + j) = v[c1]; c1++; } //getting image cluster (bytes)
где в моем случае размер вектора == 40000, значение с1 == 40000, т.е. выход за пределы вектора.
после этого пытаться прегугадывать поведение нет смысла. оно не определено.
почему так случилось, где у вас там логика нарушена - это сами ищите.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.03.2017, 23:53

"Куча была повреждена" и "<Имя проекта> вызвал срабатывание точки останова" в самых разных местах программы
Причем точки останова в этом месте нет. Исходный код очень длинный. Кто знает, как это исправить?

Повреждена куча
Запускаю - если ввожу любое число больше 2х, то все работает. Но если пишу количество: 2, программа не воспроизводит результат. И пишет,...

Повреждена куча при работе с динам. памятью. Почему? Как исправить?
Приветствую всех! Такая проблема: Вот есть код. В нем периодически появляются ошибки, а иногда и не появляется, и все хорошо работает....

Smartsputnik и прочие прилагаемые радости
Всем привет! Удалил программу time task через безопасный режим, но что делать дальше? Лог прилагаю

MBR и прочие радости жёсткого диска
Всем привет! Возникло несколько вопросов, но смежных (про геометрию жёстких дисков и загрузочные области), к тому же, предполагающих...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru