Ukazatel na proměnou třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukazatel na proměnou třídy – C / C++ – Fórum – Programujte.comUkazatel na proměnou třídy – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Remder0
Návštěvník
5. 3. 2014   #1
-
0
-

 Mám třídu:

class Foo {
    
    private:
        
        std::vector<int> intVect;

    public:
        
        std::vector<int>* getIntVect() {
            return &intVect;
        }
};

Třídu Foo vždy instanciuji pomocí new Foo(). Je bezpečné takto vracet ukazatel a s ním pracovat?

Nemůže se stát, že z nějakého důvodu bude intVect přesunut a ukazatel se stane nevalidním? Samozřejmě počítam jen s dobou dokud Foo sám neuvolním.

Předem díky za odpověd.

Nahlásit jako SPAM
IP: 85.93.124.–
vitamin+8
Grafoman
5. 3. 2014   #2
-
0
-

#1 Remder
Problem moze nastat ak bude  objekt triedy Foo zniceny ale ukazatel ti ostane funkcny:

int main(){
	std::vector<int>* ptr = nullptr;
	{
		Foo foo{};

		ptr = foo.getIntVect();

		//foo.~Foo();
	}
	///objekt foo uz neexistuje

	ptr->front() = 7;	

}

 Pouzi radsej referenciu:

std::vector<int>& Foo::getIntVect() {
	return intVect;
}

//alebo rovno const referenciu:
const std::vector<int>& Foo::getIntVect()const{
	return intVect;
}

Samozrejme aj z referenciu sa da vytvorit dangling "pointer", ale je to trochu pracnejsie :)

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Remder0
Návštěvník
5. 3. 2014   #3
-
0
-

#2 vitamin
Díky za odpověd.

Hlavní důvod proč se ptám je, že vektor při přidávání/odebírání prvků může jednotlivé prvky realokovat, takže není bezpečné ukladat si ukazatele na položky vektoru.

Z toho mě napadlo jestli podobná situace nemůže nastat se samotným vektorem. Nebo obecně s jakoukoli proměnou třídy. Jestli se nemůže stát, že proměné budou v paměti "zpřeházeny" z důvodu lepšího využití paměti nebo něco (bez toho aniž bych sám s vytvořenou instancí manipuloval).

Nahlásit jako SPAM
IP: 85.93.124.–
vitamin+8
Grafoman
5. 3. 2014   #4
-
0
-

#3 Remder
Moze to nastat napr vtedy ked samotna trieda Foo bude vo vectore   : std::vector<Foo> v;

S vectorom si treba davat velky pozor. Moze sposobyt chby ktore sa strasne zle hladaju (prejavia sa oneskorene a len niekedy). 

Raz sa my to stalo v jednom programe kde som mal obrovsky strom polymorfickych prvkoch kde niektore prvky mali vetvy ulozene vo vectore. V strome sa volali virtualne funkcie( aj s nepriamou recursiou) ktore niekedy  vytvarali dalsie prvky a vkladli ich do vectorov. Pri urcitych kombinaciach prvkov a urictom poradi zavolania funkcii to hadzalo segfaulty. Ale aspon som sa naucil pouzivat valgrind :)

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý