0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11

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

05.03.2017, 17:45. Показов 12842. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru