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.


Petr Nymsa:12.11.2017 16:07
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.
rosina.jakub:12.11.2017 20:39
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.
Matúš Olejník:13.11.2017 9:06
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;
rosina.jakub:13.11.2017 12:38
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.
Matúš Olejník:13.11.2017 12:51
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)?
rosina.jakub:13.11.2017 15:02
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.
Petr Nymsa:13.11.2017 15:07
Vyuzij valgrind nebo nejaky podobny nastroj, at vis, kde bloky dat se ti ztraci.
Matúš Olejník:13.11.2017 15:22
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
rosina.jakub:13.11.2017 15:33
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?
rosina.jakub:13.11.2017 15:39
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.
Matúš Olejník:13.11.2017 15:47
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.
rosina.jakub:13.11.2017 16:06
Skúšal som alokovať aj pre 8 pozícií aj som vymazal to pridanie nuly a nechal na 7 a nepomohlo.
rosina.jakub:13.11.2017 16:11
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.
rosina.jakub:13.11.2017 16:21
Ešte otázka, v main() to pole nemusím alokovať alebo hej?
Matúš Olejník:13.11.2017 16:53
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';
+20 Zkušeností
+2,50 Kč

Matúš Olejník:13.11.2017 17:00
Nechceš poslať celý kód?
Zobrazeno 23 zpráv z 23.