NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
rosina.jakub
Člen
Avatar
rosina.jakub:12.11.2017 14:52

Čaute,
mám funkciu "n", ktorá mi vytvorí 2D pole. V maine to zavolám pokiaľ je stlačený kláves n a tiež už prebehla iná funkcia, v ktorej sa otvorí súbor. Pokiaľ ale toto pole už je vytvorené tak sa najprv dealokuje a potom opäť prebehne funkcia na jeho vytvorenie. Mám tento kód:

if ((p_file != nullptr) && (p_spz == nullptr) && (funkcia == 'n'))
                {
                        p_spz = n(p_file);
                }
                else if ((p_file != nullptr) && (p_spz != nullptr) && (funkcia == 'n'))
                {
                        for(int i = 0; i < 5; i++)
                        {
                                free(p_spz[i]);
                        }
                        free(p_spz);
                        p_spz = n(p_file);
                }

Problém je, že program padá pokiaľ je pole vytvorí a má sa dealokovať.
Ďakujem za pomoc

 
Odpovědět
12.11.2017 14:52
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na rosina.jakub
Petr Nymsa:12.11.2017 16:07

Mozna by to chtelo poslat sem i funkci "n" a popsat trochu srozumitelneji o co se snasiz

Nahoru Odpovědět
12.11.2017 16:07
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
rosina.jakub
Člen
Avatar
rosina.jakub:12.11.2017 20:34

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.

 
Nahoru Odpovědět
12.11.2017 20:34
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Petr Nymsa
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.

 
Nahoru Odpovědět
12.11.2017 20:39
Avatar
Odpovídá na rosina.jakub
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;
Nahoru Odpovědět
13.11.2017 9:06
/* I am not sure why this works but it fixes the problem */
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
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.

 
Nahoru Odpovědět
13.11.2017 12:38
Avatar
Odpovídá na rosina.jakub
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)?

Nahoru Odpovědět
13.11.2017 12:51
/* I am not sure why this works but it fixes the problem */
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
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.

Editováno 13.11.2017 15:03
 
Nahoru Odpovědět
13.11.2017 15:02
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na rosina.jakub
Petr Nymsa:13.11.2017 15:07

Vyuzij valgrind nebo nejaky podobny nastroj, at vis, kde bloky dat se ti ztraci.

Nahoru Odpovědět
13.11.2017 15:07
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na rosina.jakub
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 :D

Nahoru Odpovědět
13.11.2017 15:22
/* I am not sure why this works but it fixes the problem */
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
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 :(

 
Nahoru Odpovědět
13.11.2017 15:33
Avatar
Odpovídá na rosina.jakub
Matúš Olejník:13.11.2017 15:34

Pošli chybu čo ti vyhodí

Nahoru Odpovědět
13.11.2017 15:34
/* I am not sure why this works but it fixes the problem */
Avatar
rosina.jakub
Člen
Avatar
rosina.jakub:13.11.2017 15:37

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?

 
Nahoru Odpovědět
13.11.2017 15:37
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
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.

 
Nahoru Odpovědět
13.11.2017 15:39
Avatar
Odpovídá na rosina.jakub
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;
Nahoru Odpovědět
13.11.2017 15:47
/* I am not sure why this works but it fixes the problem */
Avatar
rosina.jakub
Člen
Avatar
rosina.jakub:13.11.2017 15:55

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.
 
Nahoru Odpovědět
13.11.2017 15:55
Avatar
Odpovídá na rosina.jakub
Matúš Olejník:13.11.2017 16:05

To čo som poslal vyššie nepomohlo?

Nahoru Odpovědět
13.11.2017 16:05
/* I am not sure why this works but it fixes the problem */
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
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.

 
Nahoru Odpovědět
13.11.2017 16:06
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
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.

 
Nahoru Odpovědět
13.11.2017 16:11
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
rosina.jakub:13.11.2017 16:21

Ešte otázka, v main() to pole nemusím alokovať alebo hej?

Editováno 13.11.2017 16:21
 
Nahoru Odpovědět
13.11.2017 16:21
Avatar
Odpovídá na rosina.jakub
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';
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
13.11.2017 16:53
/* I am not sure why this works but it fixes the problem */
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Matúš Olejník
rosina.jakub:13.11.2017 16:56

Nič. Stále to padá

 
Nahoru Odpovědět
13.11.2017 16:56
Avatar
Odpovídá na rosina.jakub
Matúš Olejník:13.11.2017 17:00

Nechceš poslať celý kód? :D

Editováno 13.11.2017 17:01
Nahoru Odpovědět
13.11.2017 17:00
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 23.