Kezdőoldal » Számítástechnika » Programozás » Ha a dinamikus memóriában...

Ha a dinamikus memóriában létrehozott tömb összes elemét törlöm akkor az hogyan lehet, hogy a törölt objektumnak az adattagjait el tudom érni? C++.

Figyelt kérdés

//main.cpp

# include <iostream>


typedef unsigned short ushort ;

using std::cout ;

using std::endl ;


class cCat {

public:


cCat(ushort = 0,float = 0.5) ;

~cCat(void) { cout << "cCat destructor \n" ; }


void i_setAge(ushort age) { this->i_age = age ; }

ushort i_getAge()const { return ushort (this->i_age) ; }

void i_setWeight(float weight) { this->i_weight = i_weight ; }

float i_getWeight(void)const { return float (this->i_weight) ; }


private:


ushort i_age ;

float i_weight ; };


cCat::cCat(ushort age, float weight): i_age(age), i_weight(weight) { cout << "cCat constructor \n" ; }



int main(void) {

cCat *p_myArray = new cCat[11] ; //Létrehozza a konstruktor.

cCat *p_CatOne = p_myArray ; /*A tömb első elemének címét hozzárendelem egy mutatóhoz.*/

p_CatOne+= 2 ; /*Ezt sem értem hogy ez valójában miért lehetséges egy mutatóval.Egy csak egy mutató ami egy objektum címét tárolja mi köze van a többihez?Semmi akkor meg,hogy lehet csak úgy ugrani egy másik objektum címére. */


delete [] p_myArray ; //Törlöm az egész tömböt.

p_CatOne->i_setAge(8) ; /*Mivel töröltem az előbb ezért most a p_CatOne egy nemlétező objektumra mutat és mégis eltudom érni azt a törölt nemlétező objektumot.Ez hihetetlen hát hogy van ez?*/

cout << p_CatOne->i_getAge() ; /*Az összes objektum törölve lett és van i_age adattagja és i_getAge metódusa hihetetlen. */

return 0 ; }


2012. okt. 2. 02:14
 1/9 iostream ***** válasza:
89%

"Ezt sem értem hogy ez valójában miért lehetséges egy mutatóval"


A mutatóaritmetika arra a feltételezésre épül, hogy egy tömbelemre mutatsz. A te felelősséged, hogy valóban így legyen.


"Mivel töröltem az előbb ezért most a p_CatOne egy nemlétező objektumra mutat és mégis eltudom érni azt a törölt nemlétező objektumot.Ez hihetetlen hát hogy van ez?"


Amit csinálsz, úgy hívják, hogy undefined behavior. Működhet, de csinálhat bármi mást is (pl formázza a vinyód, ha vicceskedvű volt a fordítóprogram írója).

A runtime lefoglalja a memóriát, és amikor delete-t hívsz rá, felírja, hogy igen, ez a memóriaterület szabad, de nem adta vissza az oprendszernek. Tehát nyugodtan garázdálkodhatsz benne, C++-ban senki nem fogja ellenőrizni, hogy egy adott mutató érvényes objektumra mutat-e.

2012. okt. 2. 09:47
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:

Értem köszi adtam zöld kezet.


És a mutatótömböknél,hogy van ez ott is a mutatótömb neve mutat arra a címre ami a mutatótömb első eleme?


Ott valahogy nem akar működni a mutatóaritmetika.

Pedig azok is tömb elemek.

2012. okt. 2. 23:12
 3/9 iostream ***** válasza:

"És a mutatótömböknél,hogy van ez ott is a mutatótömb neve mutat arra a címre ami a mutatótömb első eleme?"


A tömb neve a tömböt jelenti. Viszont konvertálódik automatikusan és kussban az első elemre mutató mutatóvá, szóval igen, a tömb neve az első elem címét reprezentálja.

Mutass példát, hogy szerinted mi nem működik, mert a mutatótömbök is tökéletesen úgy viselkednek, mint akármelyik másik.

2012. okt. 3. 09:22
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:

int x = 5, y = 4 ;

int *myArray[2] = { &x, &y } ;

int **myArit = myArray ;


std::cout << *myArray << std::endl ; //Ez mutat a mutatótömb első elemére ami egy memóriacím igaz?


std::cout << myArray << std::endl ; //Ez mire mutat akkor?

2012. okt. 3. 16:18
 5/9 iostream ***** válasza:

"std::cout << *myArray << std::endl ; //Ez mutat a mutatótömb első elemére ami egy memóriacím igaz? "


Nem, mint említettem, a tömbnév az első elemre mutató mutatóvá alakul. Tehát a myArray (a tömbnév) az első elemre mutató mutatóként viselkedik. A *myArray az a mutató dereferálása, tehát az a tömb első eleme.

2012. okt. 3. 16:43
Hasznos számodra ez a válasz?
 6/9 anonim ***** válasza:

"std::cout << *myArray << std::endl ; //Ez mutat a mutatótömb első elemére ami egy memóriacím igaz?"

Igen, de nullától kezdődik a sorszámozás, a nulladik elemére mutat,a nulladik a legelső elem.

"std::cout << myArray << std::endl ; //Ez mire mutat akkor?"

A myArray mutató címére mutat.

2012. okt. 3. 16:43
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:

"Nem, mint említettem, a tömbnév az első elemre mutató mutatóvá alakul. Tehát a myArray (a tömbnév) az első elemre mutató mutatóként viselkedik. A *myArray az a mutató dereferálása, tehát az a tömb első eleme."

Dehát a "std::cout << *myArray << std::endl ;" és a "std::cout << myArray[0] << std::endl ;" tulajdonképpen eqvivalens ebben az esetben.

2012. okt. 3. 16:49
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:
Rosszul írtam legelőször. Vagyis a *myArray konkrétan a myArray tömb 0-ik eleme, (ami egy mutató)
2012. okt. 3. 16:52
Hasznos számodra ez a válasz?
 9/9 A kérdező kommentje:
Kösz már értem adtam zöld kezeket.
2012. okt. 3. 18:09

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!