Ошибка при выполнении программы: Куча была повреждена
Ругается при закрытии, если был создан один или несколько элементов массива:
ntdll.pdb не загружен
Вызвано исключение по адресу 0x77358529 (ntdll.dll) в name.exe: 0xC0000374: Куча была повреждена (параметры: 0x773958A0).
Необработанное исключение по адресу 0x772C761F (ntdll.dll) в name.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000000C.
Пробовала изменить значение переменной countProduct с
int countProduct = 0; //на int countProduct = 1;
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
CatalogOfProduct *enterInfoOrProduct(CatalogOfProduct* productList, int &countProduct) { int userChoiceGetProduct; getProduct: printf("\nВведите наименование продукта: "); scanf("%s", productList[countProduct - SHIFT].nameOfProduct); printf("Введите единицу измерения продукта: "); scanf("%s", productList[countProduct - SHIFT].unitOfProduct); printf("Введите количество продукта: "); scanf("%d", &productList[countProduct - SHIFT].countOfProduct); printf("Введите цену продукта: "); scanf("%f", &productList[countProduct - SHIFT].costOfProduct); printf("Внести еще продукт? (0) - Да, (1) - Нет: "); scanf("%d", &userChoiceGetProduct); if (!userChoiceGetProduct) { countProduct++; goto getProduct; } else { printf("\nИзменения сохранены. \n"); } return productList; }
Также создавать глобальный массив, создавать его в функции и возвращать в указатель.
К сожалению, не помогло.
Подскажите пожалуйста, как найти ошибку и понять, как можно избежать таких проблем в будущем.
Необработанное исключение: куча была повреждена
Куча была повреждена и прочие радости
В каждом байте BMP изображения программа подменяет последние несколько бит на биты какого-то файла.
Куча была повреждена, работа с указателями
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; int main()
Куча была повреждена. При выделении памяти
Всем привет. Вот в этой строчке(83) : XY->NextXY = new StructXY; Не понимаю что не так. После её.
Ошибка при выполнении программы: Куча была повреждена
Не могу найти ошибку. Код: #include <iostream> #include <Windows.h> #include <conio.h> .
Etyuhibosecyu, Пишем не по границам буфера, удаляем не по тем указателям, пишем по висячим ссылкам и т.п. Т.е. запись в память вместо туда куда надо в служебные области в начале блоков.
Etyuhibosecyu, Ну где то пишешь не потому адресу по которому собирался , оно затирает разметку блоков. потом когда new или delete вызываешь оно по этой переписанной непонятно чем разметке заблудилось. Кстати как вариант два раза один и тот же блок удаляешь.
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
#include struct MyString { char string[50] = "12345"; MyString *next = new MyString[0]; bool is_long = false; MyString(std::string new_string) { if (new_string.length() 50) { strcpy_s(string, new_string.c_str()); is_long = false; return; } std::string a = new_string; MyString *b = new MyString[0]; long int i = 1; while (a.length() > 50) { b[i] = a.substr(0, 50); a = a.substr(50, a.length() - 50); i++; } b[i] = a; b[0] = i;//Ошибка возникает здесь (как правило) next = b; is_long = true; } } };
Сообщение от Etyuhibosecyu
Сообщение от Etyuhibosecyu
Куча была повреждена
При компилировании выдает ошибку Вызвано исключение по адресу 0x77C7F94D (ntdll.dll) в test2.exe: 0xC0000374: Куча была повреждена (параметры: 0x77CBB960). Необработанное исключение по адресу 0x77C7F94D (ntdll.dll) в test2.exe: 0xC0000374: Куча была повреждена (параметры: 0x77CBB960). Я понимаю что ошибка в функции strcat, но не могу понять по чему
#include #include #include using namespace std; int main()
Оффтоп, если использовать std::string , можно использовать + для сложения: stackoverflow.com/a/15319868/5909792 🙂
В проекте есть функции которые работают только с переменными char, и переводить их туда обратно не хотелось бы.
1 ответ 1
Итак, поехали. Не компилировать, а выполнять.
char* Files = new char[strlen(Path) + strlen(oldname)+1];
Без проблем, менеджер памяти выделил место в памяти и отдал его вам. Само собой, никак его не чистя (вы же не говорили, что его надо инициализировать?). И там лежит, например, что-то вроде
asdgysyh782qy6yr76786bxstgq748qs67576529187%*^%$@!VFGG&%&T#@
Словом мусор. К которому вы ДОБАВЛЯЕТЕ свою строку. Приписываете ее в конец. Который может оказаться далеко за пределами выделенной памяти:
Почему бы вам не СКОПИРОВАТЬ первую часть новой строки?
Вопрос не риторический — мне действительно интересно, неужели там, откуда вы узнали о strcat (на лекции, из книги. ) ничего не было сказано сначала о strcpy ?
Куча была повреждена. При выделении памяти
Всем привет.
Вот в этой строчке(83) : XY->NextXY = new StructXY;
Не понимаю что не так. После её работы выдаёт что куча повреждена.
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
int Graph::MinLengthBetweenTwoGraph(int a, int b, StructXY * qwerty) { StructXY * XY; XY = qwerty; StructGraphData * GraphDataBegun_1, * GraphDataBegun_2; GraphDataBegun_1 = CentralGraphData; GraphDataBegun_2 = CentralGraphData; while (GraphDataBegun_1->GraphNum != a) GraphDataBegun_1 = GraphDataBegun_1->NextGraph; while (GraphDataBegun_2->GraphNum != b) GraphDataBegun_2 = GraphDataBegun_2->NextGraph; int Lenc_sris_1 = 0, Lenc_sris_2 = 0; while (GraphDataBegun_1) { Lenc_sris_1++; GraphDataBegun_1 = GraphDataBegun_1->ThisGraph; } while (GraphDataBegun_2) { Lenc_sris_2++; GraphDataBegun_2 = GraphDataBegun_2->ThisGraph; } GraphDataBegun_1 = CentralGraphData; GraphDataBegun_2 = CentralGraphData; while (GraphDataBegun_1->GraphNum != a) GraphDataBegun_1 = GraphDataBegun_1->NextGraph; while (GraphDataBegun_2->GraphNum != b) GraphDataBegun_2 = GraphDataBegun_2->NextGraph; double * DlinaDoPoints = new double[Lenc_sris_1 * Lenc_sris_2]; int * SpecPointX_1 = new int[Lenc_sris_1]; int * SpecPointY_1 = new int[Lenc_sris_1]; int * SpecPointX_2 = new int[Lenc_sris_2]; int * SpecPointY_2 = new int[Lenc_sris_2]; int VremPeremen = 0; //перебираем точки и вычисляем длины while (GraphDataBegun_1) { while (GraphDataBegun_2) { double Res = sqrt( (double)( (GraphDataBegun_1->X - GraphDataBegun_2->X) * (GraphDataBegun_1->X - GraphDataBegun_2->X) + (GraphDataBegun_1->Y - GraphDataBegun_2->Y) * (GraphDataBegun_1->Y - GraphDataBegun_2->Y) ) ); DlinaDoPoints[VremPeremen] = Res; SpecPointX_1[VremPeremen] = GraphDataBegun_1->X; SpecPointY_1[VremPeremen] = GraphDataBegun_1->Y; SpecPointX_2[VremPeremen] = GraphDataBegun_2->X; SpecPointY_2[VremPeremen] = GraphDataBegun_2->Y; VremPeremen++; GraphDataBegun_2 = GraphDataBegun_2->ThisGraph; } GraphDataBegun_2 = CentralGraphData; while (GraphDataBegun_2->GraphNum != b) GraphDataBegun_2 = GraphDataBegun_2->NextGraph; GraphDataBegun_1 = GraphDataBegun_1->ThisGraph; } //отсев больших double MinTutInMass = 0; int GoodPeremen = 0; MinTutInMass = DlinaDoPoints[0]; for (int i = 0; i VremPeremen; i++) { if ( DlinaDoPoints[i] MinTutInMass ) MinTutInMass = DlinaDoPoints[i]; } for (int i = 0; i VremPeremen; i++) { if ( DlinaDoPoints[i] > MinTutInMass ) DlinaDoPoints[i] = -1; else GoodPeremen++; } for (int i = 0; i VremPeremen; i++) { if ( DlinaDoPoints[i] != -1) { XY->Lench = DlinaDoPoints[i]; XY->X_1 = SpecPointX_1[i]; XY->X_2 =SpecPointX_2[i]; XY->Y_1 = SpecPointY_1[i]; XY->Y_2 = SpecPointY_2[i]; XY->NextXY = new StructXY; XY = XY->NextXY; XY->NextXY = NULL; } } XY = NULL; return 0; }