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

рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ:
main.cstruct 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:
рдФрд░ рднреА 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)
рдмреЗрд╢рдХ, рдпрд╣рд╛рдВ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред
рд╡реИрд▓реЗрд░рд┐рдВрдб рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреНрд░реЗрд╕ рдпрд╛ рдбреЙ.рдореЗрдореЛрд░реА, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб рд╢рдХреНрддрд┐рд╣реАрди рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕реЗ рдирдП рдЯреВрд▓ рд╕реАрдЦреЗ, рдЙрдиреНрд╣реЗрдВ рдХрдм рдФрд░ рдХреИрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдХрд┐ рдпреЗ рдЙрдкрдХрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦрди рдХреЛрдб!