NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nefunkční uvolnění pole vektoru

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
Caster
Člen
Avatar
Caster:8.11.2022 23:56

Pokouším se rozchodit funkci PBKDF2(HMAC_SHA1) podle příkladu. Při testování se mi ale program hroutí kvůli chybnému uvolnění alokovaného vektoru U o délce 4096 viz část programu, konec kódu delete:

/// Source: https://en.wikipedia.org/wiki/PBKDF2#Key_derivation_process
        std::string pbkdf2(const std::string& password, std::string salt, int iterations, int length) {

                std::string dk;

                std::vector<uint32_t*> T;

                for (int i = 1; i <= ceil(length / 20.0); i++) {




                        std::vector<uint32_t*> U;
                        U.push_back(new uint32_t[5]);

                        salt.push_back((i >> 24) & 0xff);
                        salt.push_back((i >> 16) & 0xff);
                        salt.push_back((i >> 8) & 0xff);
                        salt.push_back(i & 0xff);

                        hmac(password, salt, U[0]);



                        for (int c = 2; c <= iterations; c++) {
                                U.push_back(new uint32_t[5]);
                                hmac(password, U[i - 1], 20, U[i]);
                                pbkdf2_xor(U[0], U[1]);
                        }

                        dk += convert_be(U[0], 20);

                        for (auto& j : U) {
                                delete[] j;
                        }
                }

Zkusil jsem: Netuším, v čem je problém. Kód:

for (auto& j : U) {
        delete[] j;
}

vektor U neuvolnění a jeho délka zůstane 4096, což při jeho dalším použítí způsobí přetečení paměti a chybové hlášení.

Chci docílit: Abych vektor správně uvolnil pro další použití.

 
Odpovědět
8.11.2022 23:56
Avatar
Odpovídá na Caster
Michal Hadraba:7.4.2023 14:54

Ja mam takovy pocit, ze zakladas vector s ukazateli na int, ale pak tam pridavas pole o peti prvcich. Tam je podle me nesoulad. Vytvoris nové pole, ale do vektoru predas jen odkaz. Ve chvili, kdy mazes z vektoru pole (j), vektor ma jen odkaz a netusi, jak velke pole ma smazat.
Nezkousel jsem, ale nepomohlo by to takto?

std::vector<int[5]>;
Editováno 7.4.2023 14:55
 
Nahoru Odpovědět
7.4.2023 14:54
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 2 zpráv z 2.