рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ C / C ++ рдореЗрдВ рдкрдХрдбрд╝рдирд╛


рдореИрдВ рдЖрдкрдХреЛ рдирдорд╕реНрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдЦрдмреНрд░реЛрд╡рдЪрд┐рдпрди!


рдЖрдЬ рдореИрдВ C рдпрд╛ C ++ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдкреНрд░рдХрд╛рд╢ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред


рд╣реИрдмреЗ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рд▓реЗрдЦ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН: рд╣рдо рдореЗрдореЛрд░реА рд▓реАрдХ (рд╕реА ++ рд╕реАрдЖрд░рдЯреА) рдФрд░ рд╕реА ++ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ : рд╡рд┐рдЬреБрдЕрд▓ рд▓реАрдХ рдбрд┐рдЯреЗрдХреНрдЯрд░ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рдгрд╛рдо рди рджреЗрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ рддрдХ рд╕рдВрднрд╡ рд╣реЛ рдЙрдкрд▓рдмреНрдз рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред


рд╡рд┐рдВрдбреЛрдЬ - рд╡рд┐рдХрд╛рд╕
рдЖрдЗрдП рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддреН рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреМрд╕рд┐рдЦрд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕ рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред



рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ:


main.c
struct Student create_student(); void ControlMenu(); int main() { ControlMenu(); return 0; } void ShowListMenu(int kX) { char listMenu[COUNT_LIST_MENU][55] = { {"Read students from file"}, {"Input student and push"}, {"Input student and push it back"}, {"Input student and push it after student"}, {"Delete last student"}, {"Write students to file"}, {"Find student"}, {"Sort students"}, {"Show list of students"}, {"Exit"} }; for (int i = 0; i < COUNT_LIST_MENU; i++) { if (i == kX) { printf("%s", listMenu[i]); printf(" <=\n"); } else printf("%s\n", listMenu[i]); } } void ControlMenu() { struct ListOfStudents* list = NULL; int kX = 0, key; int exit = FALSE; ShowListMenu(kX); do { key = _getch(); switch (key) { case 72: //up { if (kX == 0) kX = COUNT_LIST_MENU-1; else kX--; }break; case 80: //down { if (kX == COUNT_LIST_MENU-1) kX = 0; else kX++; }break; case 13: { if (kX == 0) { int sizeStudents = 0; struct Student* students = (struct Student*)malloc(1 * sizeof(struct Student)); char* path = (char*)malloc(255 * sizeof(char)); printf("Put the path to file with students: "); scanf("%s", path); int size = 0; students = read_students(path, &size); if (students == NULL) { printf("Can't open this file.\n"); } else { for (int i = 0; i < size; i++) { if (i == 0) { list = init(students[i]); } else { list = add_new_elem_to_start(list, students[i]); } } } free(students); printf("\nPress any key to continue..."); getchar(); getchar(); free(path); } else if (kX == 1 || kX == 2 || kX == 3 || kX == 6) { struct Student student = create_student(); if (kX == 1) { if (list == NULL) { list = init(student); } else { list = add_new_elem_to_start(list, student); } printf("\nPress any key to continue..."); getchar(); getchar(); } else if (kX == 2) { if (list == NULL) { list = init(student); } else { list = add_new_elem_to_end(list, student); } printf("\nPress any key to continue..."); getchar(); getchar(); } else if (kX == 3) { if (list == NULL) { list = init(student); printf("The list was empty, so, list have been created.\n"); } else { int position; printf("Put the position: "); scanf("%d", &position); list = add_new_elem_after_pos(list, student, position); } printf("\nPress any key to continue..."); getchar(); getchar(); } else { if (find_elem(list, student)) printf("Student exist"); else printf("Student doesn't exist"); printf("\nPress any key to continue..."); getchar(); getchar(); } } else if (kX == 4) { if (list == NULL) { printf("List is empty.\n"); } else { list = delete_elem(list); } printf("\nPress any key to continue..."); getchar(); getchar(); } else if (kX == 5) { char* path = (char*)malloc(255 * sizeof(char)); printf("Put the path to file with students: "); scanf("%s", path); if (write_students(list, path) == 0) { printf("Can't write"); printf("\nPress any key to continue..."); getchar(); getchar(); } free(path); } else if (kX == 7) { if (list == NULL) { printf("List is empty.\n"); } else { list = sort_list(list); } printf("\nThe list was successfully sorted"); printf("\nPress any key to continue..."); getchar(); getchar(); } else if (kX == 8) { system("cls"); show_list(list); printf("\nPress any key to continue..."); getchar(); getchar(); } else exit = TRUE; }break; case 27: { exit = TRUE; }break; } system("cls"); ShowListMenu(kX); } while (exit == FALSE); while (list != NULL) { list = delete_elem(list); } } struct Student create_student() { struct Student new_student; do { printf("Write the name of student\n"); scanf("%s", new_student.first_name); } while (strlen(new_student.first_name) == 0); do { printf("Write the last name of student\n"); scanf("%s", new_student.last_name); } while (strlen(new_student.last_name) == 0); do { printf("Write the patronyminc of student\n"); scanf("%s", new_student.patronyminc); } while (strlen(new_student.patronyminc) == 0); do { printf("Write the city of student\n"); scanf("%s", new_student.city); } while (strlen(new_student.city) == 0); do { printf("Write the district of student\n"); scanf("%s", new_student.disctrict); } while (strlen(new_student.disctrict) == 0); do { printf("Write the country of student\n"); scanf("%s", new_student.country); } while (strlen(new_student.country) == 0); do { printf("Write the phone number of student\n"); scanf("%s", new_student.phoneNumber); } while (strlen(new_student.phoneNumber) != 13); char* choose = (char*)malloc(255 * sizeof(char)); while (TRUE) { printf("Does student live in hostel? Y - yes, N - no\n"); scanf("%s", choose); if (strcmp(choose, "y") == 0 || strcmp(choose, "Y") == 0) { new_student.is_live_in_hostel = TRUE; break; } if (strcmp(choose, "n") == 0 || strcmp(choose, "n") == 0) { new_student.is_live_in_hostel = FALSE; break; } } while (TRUE) { printf("Does student get scholarship? Y - yes, N - no\n"); scanf("%s", choose); if (strcmp(choose, "y") == 0 || strcmp(choose, "Y") == 0) { new_student.is_live_in_hostel = TRUE; break; } if (strcmp(choose, "n") == 0 || strcmp(choose, "n") == 0) { new_student.is_live_in_hostel = FALSE; break; } } free(choose); for (int i = 0; i < 3; i++) { char temp[10]; printf("Write the %d mark of ZNO\n", i + 1); scanf("%s", temp); new_student.mark_zno[i] = atof(temp); if (new_student.mark_zno[i] == 0) { i--; } } return new_student; } 

рдФрд░ рднреА Student.h рдФрд░ Student.c рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдФрд░ рдХрд╛рд░реНрдп рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рдПрдХ рдХрд╛рд░реНрдп рд╣реИ: рд╕реНрдореГрддрд┐ рд▓реАрдХ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ред рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╕реАрдЖрд░рдЯреАред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред


рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬрд╣рд╛рдБ рдореБрдЦреНрдп рд╕реНрдерд┐рдд рд╣реИ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ:


 #define __CRTDBG_MAP_ALLOC #include <crtdbg.h> #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #define new DEBUG_NEW 

рдФрд░ return 0 рд╕реЗ рдкрд╣рд▓реЗ return 0 рдЖрдкрдХреЛ рдпрд╣ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: _CrtDumpMemoryLeaks(); ред


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ, рд╕реНрдЯреВрдбрд┐рдпреЛ рдЗрд╕рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:


 Detected memory leaks! Dumping objects -> {79} normal block at 0x00A04410, 376 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete. 

рд╕реБрдкрд░! рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛рд▓реА рдХрд░рдирд╛ рдХрд╣рд╛рдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: рдЬрд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?



рдЬрдм рдореИрдВрдиреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕реНрдореГрддрд┐ рдпрд╣рд╛рдБ рдХрд╣реАрдВ рдЦреЛ рдЧрдИ рд╣реИ:


 if (kX == 0) { int sizeStudents = 0; struct Student* students = (struct Student*)malloc(1 * sizeof(struct Student)); char* path = (char*)malloc(255 * sizeof(char)); printf("Put the path to file with students: "); scanf("%s", path); int size = 0; students = read_students(path, &size); if (students == NULL) { printf("Can't open this file.\n"); } else { for (int i = 0; i < size; i++) { if (i == 0) { list = init(students[i]); } else { list = add_new_elem_to_start(list, students[i]); } } } free(students); printf("\nPress any key to continue..."); getchar(); getchar(); free(path); } 

рд▓реЗрдХрд┐рди рд╡рд╣ рдХреИрд╕реЗ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ рд╕рдм рдХреБрдЫ рдореБрдХреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ? рдпрд╛ рдирд╣реАрдВ?


рдФрд░ рдпрд╣рд╛рдБ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдХреЙрд▓ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде Valgrind рдпрд╛рдж рдХрд┐рдпрд╛ ...


рдирддреАрдЬрддрди, рдЪрд▓рдиреЗ рдХреЗ 15 рдорд┐рдирдЯ рдмрд╛рдж, рдореБрдЭреЗ рд╡рд╛рд▓рдЧреНрд░рд┐рдВрдб рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдорд┐рд▓рд╛ - рд╡рд┐рдЬрд╝реБрдЕрд▓ рд▓реАрдХ рдбрд┐рдЯреЗрдХреНрдЯрд░ ред рдпрд╣ рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ CRT рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ! рдореБрдЭреЗ рдпрд╣реА рдЪрд╛рд╣рд┐рдПред


рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рднрдВрдбрд╛рд░ рдореЗрдВ рдЬрд╛рдиреЗ рдФрд░ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ vld-2.5.1-setup.exe рдЦреЛрдЬрдиреЗ рдХреА vld-2.5.1-setup.exe


рд╕рдЪ рд╣реИ, рдЖрдЦрд┐рд░реА рдЕрдкрдбреЗрдЯ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2015 рдХреЗ рд╕рдордп рд╕реЗ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдорд╛рдирдХ рд╣реИ, рдмрд╕ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред


VLD рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ #include <vld.h> рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдбрд┐рдмрдЧ (F5) рдореЛрдб рдореЗрдВ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


 Visual Leak Detector read settings from: C:\Program Files (x86)\Visual Leak Detector\vld.ini Visual Leak Detector Version 2.5.1 installed. 

рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛:


 WARNING: Visual Leak Detector detected memory leaks! ---------- Block 1 at 0x01405FD0: 376 bytes ---------- Leak Hash: 0x555D2B67, Count: 1, Total 376 bytes Call Stack (TID 8908): ucrtbased.dll!malloc() test.exe!0x00F41946() test.exe!0x00F42E1D() test.exe!0x00F44723() test.exe!0x00F44577() test.exe!0x00F4440D() test.exe!0x00F447A8() KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xED bytes ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xBD bytes Data: CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ Visual Leak Detector detected 1 memory leak (412 bytes). Largest number used: 3115 bytes. Total allocations: 3563 bytes. Visual Leak Detector is now exiting. 

рдпрд╣рд╛рдБ, рдореИрдВ рдЯреНрд░реЗрд╕ рджреЗрдЦрддреЗ рд╣реИрдВ! рддреЛ, рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЗрдВ рдХрд╣рд╛рдВ рд╣реИрдВ? рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХрд╣рд╛рдВ рд╣реИрдВ?



рдареАрдХ рд╣реИ, рд╡рд╛рджрд╛ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП рдерд╛ред


рдПрдХ рд╡рд┐рдХрд▓реНрдк рд░рд╣рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ Google рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ: рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯред рдпрд╣ рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ, рдЬрдм рдЖрдк 0 рдкрд░ рд▓реМрдЯреЗрдВ, рддреЛ рдЖрдкрдХреЛ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдЯреВрд▓ рдореЗрдВ "рдореЗрдореЛрд░реА рдпреВрд╕реЗрдЬ" рдЯреИрдм рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ "рдЯреЗрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдХреНрд╖рдо рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд╣реИред рдлрд┐рд░ рдЖрдкрдХреЛ рдбрд┐рдмрдЧ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдФрд░ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдкрд╣рд▓рд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ


рджреВрд╕рд░рд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ


рддрд╕реНрд╡реАрд░ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдвреЗрд░ рдХреЗ рдиреАрдЪреЗ рдПрдХ рдЖрдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рдереАред рдЗрд╕ рдЖрдХрд╛рд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдВрдбреЛ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдРрд╕реА рд╡рд╕реНрддреБрдПрдБ рд╣реЛрдВрдЧреА рдЬреЛ рдЗрд╕ рдвреЗрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ "рдлреВ рдСрдмреНрдЬреЗрдХреНрдЯ рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдЗрдВрд╕реНрдЯреЗрдВрд╕" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рддреАрд╕рд░рд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ


рдЪреМрдерд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ


рд╣рд╛рдБ! рдпрд╣ рдПрдХ рдЬреАрдд рд╣реИ! рдХреЙрд▓ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рдЯреНрд░реЗрд╕! рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред


рд▓рд┐рдирдХреНрд╕ - рд╡рд┐рдХрд╛рд╕
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рд▓рд┐рдирдХреНрд╕ рдкрд░, рд╡реИрд▓рдЧреНрд░рд╛рдЗрдВрдб рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореМрдЬреВрдж рд╣реИред рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ (рдбреЗрдмрд┐рдпрди рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд▓рд┐рдП) рдореЗрдВ sudo apt install valgrind рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рдПрдХ рдбрд╛рдпрдиреЗрдорд┐рдХ рдПрд░реЗ рдХреЛ рднрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдореЗрдореЛрд░реА рдХреНрд▓рд┐рдпрд░ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ:


main.c
 #include <stdlib.h> #include <stdio.h> #define N 10 int main() { int * mas = (int *)malloc(N * sizeof(int)); for(int i = 0; i < N; i++) { *(mas+i) = i; printf("%d\t", *(mas+i)); } printf("\n"); return 0; } 

CLang рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ .out рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╡реЗрд▓рдЧреНрд░рд╛рдЗрдВрдб рдореЗрдВ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред


valgrind ./a.out рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдЕрдм, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреИрд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рд╡реИрд▓рдЧреНрд░рд╛рдЗрдВрдб рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛:


 ==2342== HEAP SUMMARY: ==2342== in use at exit: 40 bytes in 1 blocks ==2342== total heap usage: 2 allocs, 1 frees, 1,064 bytes allocated ==2342== ==2342== Searching for pointers to 1 not-freed blocks ==2342== Checked 68,984 bytes ==2342== ==2342== LEAK SUMMARY: ==2342== definitely lost: 40 bytes in 1 blocks ==2342== indirectly lost: 0 bytes in 0 blocks ==2342== possibly lost: 0 bytes in 0 blocks ==2342== still reachable: 0 bytes in 0 blocks ==2342== suppressed: 0 bytes in 0 blocks ==2342== Rerun with --leak-check=full to see details of leaked memory ==2342== ==2342== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) ==2342== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдм рддрдХ рдХреЗ рд╡реИрд▓рдЧреНрд░рд╛рдЗрдВрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдХрд┐рддрдиреА рдЦреЛ рдЧрдИ рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореЗрдореЛрд░реА рдХрд╣рд╛рдБ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рдереА, рдЖрдкрдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА --leak-check=full , рдФрд░ рдлрд┐рд░, рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, --leak-check=full , рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛:


 ==2348== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==2348== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==2348== by 0x40053A: main (in /home/hunterlan/Habr/a.out) 

рдмреЗрд╢рдХ, рдпрд╣рд╛рдВ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред


рд╡реИрд▓реЗрд░рд┐рдВрдб рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреНрд░реЗрд╕ рдпрд╛ рдбреЙ.рдореЗрдореЛрд░реА, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб рд╢рдХреНрддрд┐рд╣реАрди рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕реЗ рдирдП рдЯреВрд▓ рд╕реАрдЦреЗ, рдЙрдиреНрд╣реЗрдВ рдХрдм рдФрд░ рдХреИрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдХрд┐ рдпреЗ рдЙрдкрдХрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦрди рдХреЛрдб!

Source: https://habr.com/ru/post/hi480368/


All Articles