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.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
K čemu by ti bylo dealokovat něco s čím budeš ještě pracovat? Nebo jsi to myslel nějak jinak?
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
Ano, tak jak píšeš pointer si někam uložíš a až s ním dopracuješ tak to dealokuješ.
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.
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.
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é).
A vektor není dynamicky alokované pole?
A dvourozměrné je taky - výška je 1..
Chtěl bych tě vidět, jak si to obhájíš u vyučujícího
Úplně na pohodu
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číš..
Zobrazeno 12 zpráv z 12.