IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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: Deštruktor

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

Aktivity
Avatar
Imre
Člen
Avatar
Imre:8.3.2018 16:55

Zdravím, chcel by som sa opýtať, že keď si vytvorím smerníky na premenné nazov,typ či v deštruktore musím zrušiť tieto smerníky cez delete alebo ich len nastaviť na nullptr.
Ďakujem vopred za vyjadrenia a rady.

class Trieda
{
private:
        string* nazov;
        string* typ;
public:
        Trieda(string* pnazov, string* ptyp);
        Trieda();
        ~Trieda();
};

Trieda::~Trieda()
{
        delete this->nazov;
        delete this->typ;
        //alebo
        nazov = nullptr;
        typ = nullptr;

}
 
Odpovědět
8.3.2018 16:55
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Imre
Martin Petrovaj:8.3.2018 17:04

Nastavenie hodnoty pointera na null / nullptr neuvoľňuje zabranú pamäť, na to slúži delete.

Ak zmažeš údaje v pamäti, na ktorú ukazuje pointer pomocou delete, stále nemáš veľmi ako skontrolovať z iných miest v programe, či pointer stále ukazuje na existujúce dáta alebo nie. Na to musíš práve pointer nastaviť na null a niekde inde v programe ho oproti tejto hodnote pred prístupom kontrolovať.

Takže ak trváš na používaní raw pointerov, správny postup by mal byť v deštruktore použiť delete. Pokiaľ máš niekde inde v programe pointer na túto inštanciu typu Trieda, mal by si po zmazaní cez delete instanciaTriedy ešte nastaviť instanciaTriedy na nullptr. Každopádne ti odporúčam pozrieť sa na tzv. smart pointery :-)

Nahoru Odpovědět
8.3.2018 17:04
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Imre
Člen
Avatar
Odpovídá na Martin Petrovaj
Imre:8.3.2018 18:52

Deštruktor mám cez delete a mám vytvorenú inštanciu Triedy v main, ale keď zavolám delete inštancia tak ma hodí do deštruktora a ukáže mi error: project.exe has triggered a breakpoint. Čím to môže byť?

Trieda* trieda = new Trieda(&meno,&typ);


        delete trieda ;
        trieda = nullptr;
 
Nahoru Odpovědět
8.3.2018 18:52
Avatar
B42P6
Člen
Avatar
Odpovídá na Imre
B42P6:8.3.2018 18:57

Len tak zo zaujímavosti, ako prichádzaš k hodnote meno? Ako vytváraš tento string?

Editováno 8.3.2018 18:58
Nahoru Odpovědět
8.3.2018 18:57
'long long long' is too long for GCC
Avatar
Imre
Člen
Avatar
Odpovídá na B42P6
Imre:8.3.2018 19:00

Vytvorím si

string meno = "text";
 
Nahoru Odpovědět
8.3.2018 19:00
Avatar
Petr Balzer
Člen
Avatar
Odpovídá na Imre
Petr Balzer:10.3.2018 22:01

ukaž ještě hlavičku (alespoň pro mě).
Jinak, nevím, co používáš za IDE (tuhle chybu vidím po prvé...), ale ověř, zda oba ukazatelé ukazují buď na NULL, nebo na blok paměti, kam mohou zapisovat / číst.
Taky by mě zajímalo, zda máš prázdný konstruktor vytvořený (pak by to mohlo způsobovat problémy výše).

Nahoru Odpovědět
10.3.2018 22:01
Ono to ještě funguje?!?
Avatar
B42P6
Člen
Avatar
Odpovídá na Imre
B42P6:11.3.2018 19:03

delete sa používa na uvoľnenie pamäti v halde. delete používaš len na pamäť, ktorú si alokoval s operátorom new. Preto ten problém.
V tvojom prípade by si v deštruktore používal delete len v prípade, keby si v konštruktore používal na alokovanie stringov new. Preto tám žiadne delete nemá byť.
Vidím, že trocha nechápeš ako funguje new/delete, skús si prečítať nejaký článok aby si si to ujasnil.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
11.3.2018 19:03
'long long long' is too long for GCC
Avatar
Imre
Člen
Avatar
Odpovídá na B42P6
Imre:11.3.2018 23:53

áno vďaka, už mi to je jasnejšie

 
Nahoru Odpovědět
11.3.2018 23:53
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 8 zpráv z 8.