Avatar
Tycek
Člen
Avatar
Tycek:

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
Redaktor
Avatar
Odpovídá na Tycek
tomisoka:

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:

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
Redaktor
Avatar
Odpovídá na Tycek
tomisoka:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 11.12.2015 19:04
Avatar
Tycek
Člen
Avatar
Tycek:

Ž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):

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
:)
Avatar
Polymath
Člen
Avatar
Polymath:

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  +1 12.12.2015 9:14
Avatar
Tycek
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Tycek:

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:

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
Tým ITnetwork
Avatar
Odpovídá na Tycek
David Novák:

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):

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
:)
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Luboš Běhounek (Satik)
David Novák:

Ú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.