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.


Zobrazeno 23 zpráv z 23.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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';
Zobrazeno 23 zpráv z 23.