C++ Memória felszabadítás.

Címkék
C++ Memória felszabadítás.
2021-02-15T13:49:25+01:00
2021-02-15T16:59:35+01:00
2022-08-12T00:55:31+02:00
beginner511
Sziasztok, 
Kezdő vagyok programozásban és lenne pár kérdésem.
Itt ez a kód, példaként ezt írtam.
Azt szeretném tudni, hogy ez helyes memória kezelés e.
Hogyha létrehozok egy osztályt ami most "Alma" névre hallgat, és az ebből létrehozott objektumokat, egy "vec" nevezetű vectorban szeretném tárolni majd a folyamat végén felszabadítani a memóriát akkor ez egy jó megoldás vagy sem.

class Alma { public: Alma(int x_) { x = x_; } ~Alma() {} int getX() { return x; } private: int x; }; int main() { vector<Alma*>vec; for (int i = 0; i < 3; i++) { Alma* a = new Alma(i); vec.push_back(a); } //Csinál valamit, jelen esetben ugye csak kiírja... for (int i = 0; i < vec.size(); i++) { cout << vec[i]->getX() << endl; } //Először felszabadítja a memóriát majd a vectorból is törli az elemeket for (int i = 0; i < vec.size(); i++) { delete vec[i]; cout << vec[i]->getX() << endl; } vec.erase(vec.begin(),vec.end()); //------------------------------- //Másik kérdés int** tomb = new int*[5]; for (int i = 0; i < 5; i++) { tomb[i] = new int[5]; } for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { tomb[i][j] = 3; } } valami(tomb); //törlés for (int i = 0; i < 5; i++) { delete[] tomb[i]; } delete[] tomb; system("pause"); } void valami(int** tomb) { //Itt nem hozok létre semmi új dolgot sem.. //Számol valamit.. //itt kell ismét törölni vagy sem??????????????? /*for (int i = 0; i < 5; i++) { delete[] tomb[i]; } delete[] tomb;*/ }
A válaszokért hálás vagyok :))
Mutasd a teljes hozzászólást!

  • Közvetlenül a felszabadítás után meghívod a getX metódusát: amikor már nem létezik. Az hiba: fordított sorrendben kellene, de szerintem ez csak bennemaradt a ciklusban, mert előzőleg már kiírtad. A többi jónak tűnik. Konstruktorban egyébként így szoktuk csinálni: Alma(int x_): x(x_) {}, a destruktor pedig felesleges, mivel {}.
    Mutasd a teljes hozzászólást!
  • Igen az csak benne maradt, megnéztem hogy így mit ír ki :D
    A konstruktoros dolgot köszönöm.

    Erre még kiváncsi lennék, ha az eljárásnak átadom ezt az int ** tomb-öt, de új int**  -ot nem hozok létre ezen az eljáráson belül akkor kell törölni  a tomb-öt, vagy elég csak a fő függvényben később?

    void valami(int** tomb) { //Itt nem hozok létre semmi új dolgot sem.. //Számol valamit.. //itt kell ismét törölni vagy sem??????????????? /*for (int i = 0; i &lt; 5; i++) { delete[] tomb; } delete[] tomb; */ }
    Mutasd a teljes hozzászólást!
  • &lt; helyett írj nyugodtam <-et.

    A felszabadítás azt jelenti, hogy ahol van a memóriában, onnantól kezdve azt a területet szabad területként tartja nyilván. Vagyis ha lefoglalás van utána, akár oda teszi: felülírja. Már felszabadításkor is felülírhatja, mivel az is módosítás hogy a szabad területek nyilvántartásába beteszi. Ami a lényeg, hogy felszabadítás után nem szabad rá hivatkozni: a címére szabad, de a tartalmára nem: se olvasni, se írni! És természetesen csak 1-szer szabad felszabadítani! A te példádban a for ciklusban egy csomószor felszabadítod, meg még utána is 1-szer. Összesen 1-szer szabad csak! Lehet a valami rutinban is, ekkor miután visszatért a valami a hívójához, már törölve lesz, így nem lesz elérhető. Sokszor kell utána is, így általában kint szoktuk csak felszabadítani.

    int** tomb, i;

    esetén int i; lesz, nem int** i; ezért szoktuk úgy írni, hogy a ** az azonosítóhoz tartozik, nem a típushoz:

    int **tomb, i;

    A szóköz van máshol, így legalább nem megtévesztő.
    Mutasd a teljes hozzászólást!
  • ezért szoktuk úgy írni, hogy a ** az azonosítóhoz tartozik, nem a típushoz

    Ez azért ennyire nem egyértelmű. A kódbázisra vonatkozó styleguide-nak megfelelően kell csinálni, hogy egységes legyen.
    Személy szerint egyértelmű preferenciám az 'int** variable;' a 'int **variable;'-el szemben.
    Sokkal folyékonyabban olvasható szerintem (számomra biztosan).
    Mutasd a teljes hozzászólást!
Címkék
abcd