NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Uvolnění paměti alokované ve funkci

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

Aktivity
Avatar
Tycek
Člen
Avatar
Tycek:11.12.2015 18:49

Zdravím, mám takový problém. Potřeboval bych uvolnit paměť, kterou jsem alokoval ve funkci s tím, že ukazatel na tu alokovanou paměť musí ta funkce vrátit.

int** Funkce(){

    int** novePole;
    novePole = new int*[3];
    for(int i = 0 ; i<3 ; i++){
        novePole[i] = new int[4];
    }
     // dělej něco
    return novePole;
}
 
Odpovědět
11.12.2015 18:49
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Tycek
tomisoka:11.12.2015 18:52

K čemu by ti bylo dealokovat něco s čím budeš ještě pracovat? Nebo jsi to myslel nějak jinak?

 
Nahoru Odpovědět
11.12.2015 18:52
Avatar
Tycek
Člen
Avatar
Odpovídá na tomisoka
Tycek:11.12.2015 18:58

To je právě ten problém se kterým si nevím rady.
Když funkce skončí a předá ten ukazatel do mainu, tak ta paměť která se alokovala ve funkci, zůstane navždy alokovaná ne?

Ještě mě napadlo, že bych ten vrácený ukazatel, uložil do ukazatele v mainu a ten pak uvolnil. Otázkou však je, jestli to tak jde udělat

 
Nahoru Odpovědět
11.12.2015 18:58
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Tycek
tomisoka:11.12.2015 19:04

Ano, tak jak píšeš pointer si někam uložíš a až s ním dopracuješ tak to dealokuješ.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
11.12.2015 19:04
Avatar
Tycek
Člen
Avatar
Tycek:11.12.2015 19:05

Že jsem chvíli nepočkal s vytvářením tématu. :D Nevadí, možná to pomůže někomu, kdo si taky nebude vědět rady. :)
Díky za pomoc. :)

 
Nahoru Odpovědět
11.12.2015 19:05
Avatar
Luboš Běhounek Satik:12.12.2015 8:57

Místo pole bych využil třeba vector intů, je pak přeci jen menší šance, že se ti něco neuvolní :)

A bežný postup je alokovat paměť ještě před voláním funkce, osobně bych to tedy použil nějak takhle:

void funkce()
{
        vector<int> numbers;
        naplncisly(&numbers);
        // tady už mám naplněno numbers čísly a vektor numbers se na konci téhle funce sám uvolní, protože je na stacku
}

a samotná funkce by vypadala nějak takhle

void naplncisly(vector<int>* list)
{
        for (int i=0; i<5; i++)
                list->push_back(i);
}

Pokud by ta funkce měla jen alokovat paměť, pak bych ji pojmenoval tak, aby název začínal třeba na "Allocate", prostě aby už z názvu bylo jasné, že alokuje paměť a musím ji pak uvolnit.

Nahoru Odpovědět
12.12.2015 8:57
https://www.facebook.com/peasantsandcastles/
Avatar
Polymath
Člen
Avatar
Polymath:12.12.2015 9:14

Explicitní new by se v C++ vůbec nemělo používat, je to bad practice a vede to jen k problémům. STL nabízí dostatek různých tříd, které jsou efektivní a hlavně bezpečné.

 
Nahoru Odpovědět
12.12.2015 9:14
Avatar
Tycek
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
Tycek:12.12.2015 12:25

Bohužel v tomhle nemám žádnou volnost. Je to semestrální práce, kde je explicitně napsáno, že musíme použít dynamicky alokované dvourozměrné pole. Pokud by tomu tak nebylo, asi bych sáhnul po vektorech. :)

 
Nahoru Odpovědět
12.12.2015 12:25
Avatar
Polymath
Člen
Avatar
Odpovídá na Tycek
Polymath:13.12.2015 16:12

Tak v tom případě doporučuju napsat si kolem toho pole wrapper, aby nedošlo k leakům. V C++ je move sémantika, která je přesně pro takovéto případy. Objekt se vrátí z funkce, volající použije to obalené pole a vše se pak automaticky zahodí. Příkladem budiž auto_ptr (to je dávno deprecated, ale jako cvičeni to je užitečné).

 
Nahoru Odpovědět
13.12.2015 16:12
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Tycek
David Novák:13.12.2015 18:31

A vektor není dynamicky alokované pole? :D

A dvourozměrné je taky - výška je 1.. ;)

Nahoru Odpovědět
13.12.2015 18:31
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Luboš Běhounek Satik:13.12.2015 18:37

Chtěl bych tě vidět, jak si to obhájíš u vyučujícího %P

Nahoru Odpovědět
13.12.2015 18:37
https://www.facebook.com/peasantsandcastles/
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
David Novák:13.12.2015 19:13

Úplně na pohodu :P

Možná by mě pak neměl rád.. Ale na to se prostě nedá nic říct. Alokuje se paměť pro vektor v době překladu? Ne -> dynamické

Co je to vektor? Lineární, homogenní datová struktura -> pole

Co je to dvourozměrné? Obecně něco, co má šířku a výšku. Vektor má výšku 1 a šířku podle toho, kolik tam toho strčíš.. :D

Nahoru Odpovědět
13.12.2015 19:13
Chyba je mezi klávesnicí a židlí.
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 12 zpráv z 12.