Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem [C++] Uvolňovanie pamäte

Začal som sa učiť C++ (obyčajné Win32 aplikácie bez gc)

vytvorím objekt na halde...

auto objekt = new Trieda();

Neuvolním pamäť (pomocou delete) aplikácia sa ukončí a nikde žiadna chyba. Správa sa to ako s gc, ale neni tam gc.

Kedysi dávno som programoval v Pascale aj Delphi bez gc a pamatám si ako keď som neuvolnil pamať pomocou Free() program vyhadzoval chyby. V C++ je to inak? Poprosil by som aj odkaz na nejaký článok kde je podrobne rozobraté ako funguje správa pamäti v C++.

Předmět Autor Datum
prekladac C++ neni manzelka ani svokra (na rozdiel od inych prekladacov) a teda sa ti do toho nestar… nový
MM.. 29.04.2012 18:07
MM..
1. Vdaka a nevadi ked v tele triedy pouzijem this so sipkou trebars "this->premnena" a potom objekt… nový
Faustt 29.04.2012 18:24
Faustt
1. ano aj na zasobniku ma ten objekt pointer (//edit: ale celkom nechapem naco potrebujes this, v ra… nový
MM.. 29.04.2012 18:36
MM..
This sa mi obcas zide ked ma napriklad clenska premmna rovnaky nazov ako lokalna premmna. nový
Faustt 29.04.2012 18:50
Faustt
no hej, aj ked tomu by som sa radsej vyhybal (=bordel :D) Ale ok. mozes to pouzit aj ked je objekt n… nový
MM.. 29.04.2012 18:59
MM..
Mmmmmm. Ukazatel this ukazuje na proměnnou v rámci třídy. Například: int mojePremenna; class Trie… nový
Flash_Gordon 29.04.2012 18:37
Flash_Gordon
Vďaka za objasnenie. nový
Faustt 29.04.2012 18:51
Faustt
No. Psal jsem to přímo z hlavy a chybička se vloudila. Předchozí příklad vypíše 77 (tedy vždy lokáln… poslední
Flash_Gordon 29.04.2012 19:19
Flash_Gordon

prekladac C++ neni manzelka ani svokra (na rozdiel od inych prekladacov) a teda sa ti do toho nestara.
Ked to rezervujes cez new, a neuvolnis, tak pamat zostane alokovana. Az zavolas tu funkciu milionkrat tak ti dojde volna RAM. (//edit: a to vobec neni vec zla, jak si mylne vela ludi mysli, ptz takto mozem predavat pointre a viem ze mi to nejaky pakovsky automaticky collector neodstreli. Len clovek musi mysliet aj na uvolnovanie).
Po ukonceni vsetkych instancii aplikacie uvolni Windows (resp. OS) vsetku RAM ktoru mala aplikacia pridelenu, takze po zavreti aplikacie tu chybu uz nevidno.
Ked to nepotrebujes rezervovat dynamicky a chces aby objekt platil len v ramci tej jednej funkcie, tak nepouzivaj new, ale deklaruj objekt ako normalne lokalnu premennu, potom po ukonceni funkcie objekt zmizne.

1. Vdaka a nevadi ked v tele triedy pouzijem this so sipkou trebars "this->premnena" a potom objekt vytvorim na zasobniku?

2. este mam otazku ked vlozim funkciu priamo do tela triedy, tak sa prelozi ako inline funkcia? nieco sa mi mari ze to tak platilo, ale nie som si isty.

class Trieda
{
public:
	void Metoda1(); //normalna funkcia
	void Metoda2() //inline funkcia
	{
	}
};

void Trieda::Metoda1()
{
}

1. ano aj na zasobniku ma ten objekt pointer (//edit: ale celkom nechapem naco potrebujes this, v ramci triedy automaticky ides na memberov nemusis tam pisat this->. this treba len v specialnych pripadoch)
2. tak toto neviem, vseobecne ale ak mas zapnute vsetky optimalizacie compilera (/Oneco apod) co je default pre release, tak robi compiler automaticky inline tam kde je to vhodne. Ak chces vynutit inline mozes pouzit klucove slovo inline tusim. Ale nechapem celkom naco potrebujes inline, to sa snazis robit nieco super-optimalizovane na speed? To by som potom robil radsej v cistom C.

Mmmmmm.

Ukazatel this ukazuje na proměnnou v rámci třídy.

Například:

int mojePremenna;

class Trieda
{
public:
	int mojePremenna;
        void vypisPremenne(); 
	Trieda() 
	{
           mojePremenna = 4; 
           this-> mojePremenna = 7;
	}
       

};

void Trieda::vypisPremenne()
{
cout << mojePremenna;  // vypise 4

cout << this->mojePremenna; // vypise 7
}


Co se týče druhého dotazu, tak to samozřejmě záleží na překladači.
A překladači je úplně jedno jestli funkci deklaruješ a definuješ přímo ve třídě nebo mimo.
Jedná se jen o estetickou záležitost (přehlednost).

To zda funkce bude v programu inline určuje právě klíčové slovo inline před funkcí.
např.:

inline int main(int a, int b) {
    if (a < b)
        return a;
    return b;
}

Zdraví SL

No. Psal jsem to přímo z hlavy a chybička se vloudila.
Předchozí příklad vypíše 77 (tedy vždy lokální proměnnou ve třídě)
Zkoušel jsem to na Microsofťáckém překladači.

Globální proměnnou ve třídě je asi dobré vždy rozlišit jmenným rozsahem :: tyto dvě tečky.

Tady je úplný příklad na kterém jsem si to otestoval:

#include "stdafx.h"
#include <iostream>

int mojePremenna;

class Trieda
{
public:
	int mojePremenna;
        void vypisPremenne(); 
	Trieda() 
	{
		::mojePremenna = 4; 
           this->mojePremenna = 7;
	}
       

};

using std::cout;

void Trieda::vypisPremenne()
{
	cout << ::mojePremenna;  // vypise 4

cout << this->mojePremenna; // vypise 7
}


int _tmain(int argc, _TCHAR* argv[])
{
	
	
	Trieda *mojeTrida = new Trieda();
	
	mojeTrida->vypisPremenne();

	std::cin >> mojePremenna;  // pro pauznutí výstupu, tady naplňujeme globální proměnnou.

        delete mojeTrida;
	return 0;
}


A mm má pravdu v tom, že ve třídě je zbytečné psát ukazatel this (nemusí to být v tom kódu).

Zpět do poradny Odpovědět na původní otázku Nahoru