Diskuze: Dealokácia 2D poľa
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Mozna by to chtelo poslat sem i funkci "n" a popsat trochu srozumitelneji o co se snasiz
Jasné sorry
char** n(FILE *p_file) {
int poc = 0, i = 1, j = 0, l, k=0;
char ch;
while (!feof(p_file)) {
ch = fgetc(p_file);
if (ch == '\n') {
poc++;
}
}
poc = poc / 5;
char **p_spz = (char **)malloc(sizeof(char *)*poc);
fseek(p_file, 0L, SEEK_SET);
char riadok[50];
while (fgets(riadok, sizeof(riadok), p_file)) {
if (i == 2) {
p_spz[k] = (char *)malloc(sizeof(char) * 7);
for (l = 0; l < 7; l++) {
p_spz[k][l] = riadok[l];
}
p_spz[k][7] = 0;
k++;
}
else if (i == 5) {
i = 0;
}
i++;
}
fseek(p_file, 0L, SEEK_SET);
return p_spz;
}
Čiže ide o to, že zo súboru prečítam 2 a následne každý 5 riadok a zapíšem ho do 2D poľa. Súbor som si už otvoril predtým v inej funkcií. Všetko funguje správne až po dealokáciu poľa.
Pokiaľ sa funkcia n() už spustila predtým a pole je už vytvorené musí sa dealokovať a potom funkcia n() prebehne znova a vytvorí opäť pole.
for(int i = 0; i < 5; i++) {
free(p_spz[i]);
}
Ako vieš že p_spz má práve päť pointerov? Vo funkcii n jeho veľkosť záleží od
poc = poc / 5;
V tomto prípade viem že poc je 5. Samozrejme tam dám počítadlo. Potrebujem len vyriešiť problém s tou dealokáciou.
Aha tak teda keď debuguješ určite tam je 5 hej? Čiže v súbore máš počet riadkov v rozmedzí <25, 29> aby ti poc / 5 dalo 5 (pre istotu sa pýtam)?
Ja tam mám 5 blokov záznamov. Každý záznam má 5 riadkov. Celkovo tam mám 25 riadkov ale ja potrebujem mať iba 5, pretože vyberám z každého bloku iba jeden konkrétny riadok. Preto mi to ide do 5.
Vyuzij valgrind nebo nejaky podobny nastroj, at vis, kde bloky dat se ti ztraci.
Chápem prečo to tak máš, len sa mi zdá že jediná chyba by mohla byť v tom for cykle na uvolnenie a teda či náhodou tam nemáš viacej riadkov. Napr. ak každý ten blok je oddelený novým riadkom tak by ich tam mohlo byť kľudne 30 a vtedy bude poc = 6
Nie viem, že ich tam je celkovo 25. Určite tam dám to počítadlo ešte, ale len som to potreboval vyskúšať či to funguje správne. A nefunguje
Pokiaľ dám cyklus s free() preč a nechám iba p_spz = NULL, tak všetko funguje. Týmto spôsobom ale nemám správne dealokovanú pamäť, že?
Vypíše mi
HEAP CORRUPTION DETECTED : after Normal block (#148) at 0x009DE220
CRT detected that the application wrote to memory after end of heap buffer.
Tak som si aj všimol že tuto alokuješ miesto pre 7 charov, následne ich vo fori naplníš a potom na siedmu pozíciu ktorá nie je alokovaná chceš priradiť nulu
p_spz[k] = (char *)malloc(sizeof(char) * 7);
for (l = 0; l < 7; l++) {
p_spz[k][l] = riadok[l];
}
p_spz[k][7] = 0;
Nainštaloval som si niečo na Memory Leaks a tu výstup.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0136BD80: 16 bytes ----------
Leak Hash: 0x6BC789AE, Count: 1, Total 16 bytes
Call Stack (TID 3748):
MSVCR110D.dll!malloc()
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (125): ConsoleApplication1.exe!n() + 0xF bytes
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (248): ConsoleApplication1.exe!main() + 0x9 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (536): ConsoleApplication1.exe!__tmainCRTStartup() + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): ConsoleApplication1.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xFD bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xCD bytes
Data:
D0 BD 36 01 18 BE 36 01 60 BE 36 01 A8 BE 36 01 ..6...6. `.6...6.
---------- Block 2 at 0x0136BDD0: 7 bytes ----------
Leak Hash: 0xF292F1EF, Count: 1, Total 7 bytes
Call Stack (TID 3748):
MSVCR110D.dll!malloc()
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (130): ConsoleApplication1.exe!n() + 0xA bytes
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (248): ConsoleApplication1.exe!main() + 0x9 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (536): ConsoleApplication1.exe!__tmainCRTStartup() + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): ConsoleApplication1.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xFD bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xCD bytes
Data:
42 41 35 33 35 41 42 BA535AB. ........
---------- Block 3 at 0x0136BE18: 7 bytes ----------
Leak Hash: 0xF292F1EF, Count: 1, Total 7 bytes
Call Stack (TID 3748):
MSVCR110D.dll!malloc()
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (130): ConsoleApplication1.exe!n() + 0xA bytes
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (248): ConsoleApplication1.exe!main() + 0x9 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (536): ConsoleApplication1.exe!__tmainCRTStartup() + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): ConsoleApplication1.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xFD bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xCD bytes
Data:
53 43 31 32 38 42 44 SC128BD. ........
---------- Block 4 at 0x0136BE60: 7 bytes ----------
Leak Hash: 0xF292F1EF, Count: 1, Total 7 bytes
Call Stack (TID 3748):
MSVCR110D.dll!malloc()
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (130): ConsoleApplication1.exe!n() + 0xA bytes
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (248): ConsoleApplication1.exe!main() + 0x9 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (536): ConsoleApplication1.exe!__tmainCRTStartup() + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): ConsoleApplication1.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xFD bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xCD bytes
Data:
42 4C 35 38 35 4C 42 BL585LB. ........
---------- Block 5 at 0x0136BEA8: 7 bytes ----------
Leak Hash: 0xF292F1EF, Count: 1, Total 7 bytes
Call Stack (TID 3748):
MSVCR110D.dll!malloc()
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (130): ConsoleApplication1.exe!n() + 0xA bytes
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (248): ConsoleApplication1.exe!main() + 0x9 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (536): ConsoleApplication1.exe!__tmainCRTStartup() + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): ConsoleApplication1.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xFD bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xCD bytes
Data:
42 41 38 35 38 42 41 BA858BA. ........
---------- Block 6 at 0x0136C848: 7 bytes ----------
Leak Hash: 0xF292F1EF, Count: 1, Total 7 bytes
Call Stack (TID 3748):
MSVCR110D.dll!malloc()
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (130): ConsoleApplication1.exe!n() + 0xA bytes
c:\users\kubo\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp (248): ConsoleApplication1.exe!main() + 0x9 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (536): ConsoleApplication1.exe!__tmainCRTStartup() + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): ConsoleApplication1.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xFD bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xCD bytes
Data:
53 43 33 32 31 44 43 SC321DC. ........
Visual Leak Detector detected 6 memory leaks (267 bytes).
Largest number used: 267 bytes.
Total allocations: 267 bytes.
Skúšal som alokovať aj pre 8 pozícií aj som vymazal to pridanie nuly a nechal na 7 a nepomohlo.
Alokujem to správne?
Potrebujem prečítať, v tomto prípade, 5 záznamov a z každého záznamu
vytiahnuť ŠPZ, ktorá má veľkosť 7 znakov.
Ešte otázka, v main() to pole nemusím alokovať alebo hej?
Skús takto zabúdam na null terminátor
p_spz[k] = (char *)malloc(sizeof(char) * 8);
for (l = 0; l < 7; l++) {
p_spz[k][l] = riadok[l];
}
p_spz[k][7] = '\0';
Nechceš poslať celý kód?
Zobrazeno 23 zpráv z 23.